1 回答
TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
https://www.example.com/index.php?/my-seo-friendly-uri
此 URL 包含一個(gè)查詢字符串,因此需要一個(gè)稍有不同的規(guī)則才能匹配它。該模式僅與 URL 路徑匹配(在本例中)。查詢字符串在其自己的變量中可用。RewriteRuleindex.php
在現(xiàn)有指令之前添加以下內(nèi)容(除了匹配的指令 - 作為路徑信息傳遞):/index.php/my-seo-friendly-url
# Redirect URLs of the form "/index.php?/my-seo-friendly-uri"
# And "/?/my-seo-friendly-uri"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(/.*)
RewriteRule ^(index\.php)?$ %1 [QSD,R=302,L]
捕獲查詢字符串(第 2 個(gè)條件),并使用反向引用 () 來(lái)構(gòu)造重定向。%1
為了防止重定向循環(huán),需要針對(duì)環(huán)境變量進(jìn)行檢查的第一個(gè)條件,因?yàn)槟坪踉谏院蟮闹貙懼惺褂貌樵冏址椒▉?lái)路由代碼字符 URL。env var 在初始請(qǐng)求中為空,但在首次成功重寫后設(shè)置為“200”(如 200 OK HTTP 狀態(tài))。REDIRECT_STATUSREDIRECT_STATUS
需要標(biāo)志 (Apache 2.4+) 才能從重定向請(qǐng)求中丟棄原始查詢字符串。如果您仍在使用 Apache 2.2,請(qǐng)改為將一個(gè)(空查詢字符串)附加到替換字符串中。即。QSD?%1?
通過(guò)使匹配可選(即),它還將規(guī)范省略的URL,但仍包括查詢字符串(當(dāng)前可能是也可能不是問(wèn)題)。例如。.index.php^(index\.php)?$index.php/?/my-seo-friendly-uri
請(qǐng)注意,這當(dāng)前是 302(臨時(shí))重定向(與現(xiàn)有重定向一樣)。只有在確認(rèn)它工作正常后,才將其更改為301(永久)重定向,301由瀏覽器永久緩存,因此可能會(huì)使測(cè)試出現(xiàn)問(wèn)題。
總結(jié)
您的文件應(yīng)如下所示:.htaccess
RewriteEngine On
# Query string...
# Redirect URLs of the form "/index.php?/my-seo-friendly-uri"
# And "/?/my-seo-friendly-uri"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^(/.*)
RewriteRule ^(index\.php)?$ %1 [QSD,R=302,L]
# Path-Info...
# Redirect URLs of the form "/index.php/my-seo-friendly-uri"
# Also handles "/index.php" only
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index.php(?:/(.*))?$ /$1 [R=302,L]
# CodeIgniter Front-controller
# (NB: Using query string method to pass the URL)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [L]
附加說(shuō)明...
包裝器不是必需的。
<IfModule>(.*)與因?yàn)檎齽t表達(dá)式在默認(rèn)情況下是貪婪的一樣。^(.*)$我已經(jīng)修改了您現(xiàn)有的路徑信息重定向(即)以僅重定向請(qǐng)求。這現(xiàn)在需要一個(gè)額外的條件來(lái)避免重定向循環(huán)。
/index.php/foo/index.php您的 CodeIgniter 前端控制器正在使用查詢字符串方法傳遞到后端(如問(wèn)題中所用)。但是,您已經(jīng)設(shè)置了 - 這與此相矛盾(盡管不一定是問(wèn)題)。但是,如果您使用的是該方法,則可以從最終替換字符串的末尾刪除部件。例如:
/my-seo-friendly-url$config['uri_protocol'] = 'REQUEST_URI';REQUEST_URI?/$1RewriteRule例如,從這個(gè):
RewriteRule (.*) index.php?/$1 [L]
對(duì)此:
RewriteRule . index.php [L]
- 1 回答
- 0 關(guān)注
- 115 瀏覽
添加回答
舉報(bào)
