簡體   English   中英

如何修復:RewriteRule 在 .htaccess 中不起作用

[英]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]

? 在正則表達式的末尾使前面的字符(上面示例中的tn )可選,這在這里沒有真正意義。 此外,您不需要重寫同一個文件——您不希望此處發生任何重寫/替換。 所以,上面的是一樣的:

RewriteRule ^(robots\.txt|ads\.txt|sellers.json)$ - [L]

- (連字符)明確表示“無替代”。

然而,在上面的(否定字符類)指令中包含了一個“點”,這個指令是多余的,除了“提前失敗”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM