[英]How to fix: RewriteRule not working in .htaccess
請考慮我的.htaccess
中的內容:
##
Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /
## Allow a few SEO Files direct access.
RewriteRule ^robots.txt?$ robots.txt [L]
RewriteRule ^ads.txt?$ ads.txt [L]
RewriteRule ^sellers.json?$ sellers.json [L]
## Avoid rewriting rules for the admin section
RewriteRule ^(admin|resources)($|/) - [L]
## Set Ajax Request File
RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]
## Set controller with id
RewriteRule ^([^/]+)/([0-9]+)/?$ index.php?con=$1&id=$2 [L,QSA]
## Set controller with slug
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?con=$1&slug=$2 [L,QSA]
## For paging
RewriteRule ^([^/]+)/page/([0-9]+)/?$ index.php?con=$1&page=$2 [L,QSA]
RewriteRule ^([^/]+)/([^/]+)/page/([0-9]+)/?$ index.php?con=$1&slug=$2&page=$3 [L,QSA]
## Set controller for only one parameter
RewriteRule ^page/([^/]+)/?$ index.php?con=page&slug=$1 [L,QSA]
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]
## Set home page
RewriteRule ^/?$ index.php?con=home [L]
每當我嘗試瀏覽http://example.com/kahuk-ajax/?prefix=manage-story-vote
時,都會打開index.php
而不是kahuk-ajax.php
!
我究竟做錯了什么?
## Set Ajax Request File RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]: ## Set controller for only one parameter: RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]
該請求首先被第一條規則重寫為kakuk-ajax.php
,但倒數第二條規則隨后在重寫引擎的第二次傳遞期間將其重寫為index.php
。
您需要防止第二條規則重寫kakuk-ajax.php
形式的請求。 如果這些 URL 在第一個路徑段(通常分隔文件擴展名)中不包含點,那么您可以簡單地在否定字符 class 中包含一個點。例如:
## Set controller for only one parameter
:
RewriteRule ^([^/.]+)/?$ index.php?con=$1 [L,QSA]
或者,排除特定的文件擴展名:
RewriteCond %{REQUEST_URI} \.(txt|json|php)$
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]
或者,任何看起來像具有文件擴展名的 URL:
RewriteCond %{REQUEST_URI} \.\w{2,5}$
RewriteRule ^([^/]+)/?$ index.php?con=$1 [L,QSA]
在旁邊:
RewriteRule ^(kahuk-ajax)/?$ kahuk-ajax.php? [L,QSA]
這個規則有點矛盾。 您要刪除尾隨?
, 但隨后再次附加QSA
標志。 如果您希望保留查詢字符串,則兩者都不需要。 由於您正在捕獲 URL 路徑,因此您不妨在替換字符串中使用它。 例如:
RewriteRule ^(kahuk-ajax)/?$ $1.php [L]
另外,請注意不要在此處使用可選的尾部斜杠。 這會促進可能導致 SEO 問題的重復內容。 考慮將一個重定向到另一個。
## Allow a few SEO Files direct access. RewriteRule ^robots.txt?$ robots.txt [L] RewriteRule ^ads.txt?$ ads.txt [L] RewriteRule ^sellers.json?$ sellers.json [L]
的?
在正則表達式的末尾使前面的字符(上面示例中的t
和n
)可選,這在這里沒有真正意義。 此外,您不需要重寫同一個文件——您不希望此處發生任何重寫/替換。 所以,上面的是一樣的:
RewriteRule ^(robots\.txt|ads\.txt|sellers.json)$ - [L]
-
(連字符)明確表示“無替代”。
然而,在上面的(否定字符類)指令中包含了一個“點”,這個指令是多余的,除了“提前失敗”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.