Apache-2.4

帶有查詢的 URL 重寫規則不起作用

  • August 23, 2021

我寫了以下重寫規則:

<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} rp=\/knowledgebase\/.*
RewriteRule ^\/customer\/index.php /knowledgebase/ [R=301,L]
RewriteRule ^\/customer\/knowledgebase\.php$ /knowledgebase/ [R=301,L,QSA]
</IfModule>

重定向 URL,例如

https://www.example.com/customer/index.php?rp=/knowledgebase/5/DataNumen-Excel-Repairhttps://www.example.com/knowledgebase/

並重定向 URL,例如

https://www.example.com/customer/knowledgebase.phphttps://www.example.com/knowledgebase/

但兩者都不起作用。為什麼?

更新

我嘗試將 MrWhite 的程式碼從 /.htaccess 放到 /customer/.htaccess 並進行一些小的更改以採用更改,如下所示:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.example.com/knowledgebase/ [QSD,R=301,L,NC]

RewriteRule ^knowledgebase\.php$ https://www.example.com/knowledgebase/ [R=301,L,NC]

現在重定向有效。但是,它僅適用於以下情況:

https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair

但對於像這樣的情況

https://www.example.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair

不起作用。即使我在 RewriteCond 中將 ^rp= 更改為 rp。

重寫規則 ^/customer/index.php /knowledgebase/

$$ R=301,L $$

在中,模式.htaccess匹配的 URL 路徑(即。)不以斜杠開頭,因此永遠不會匹配。匹配的 URL 路徑相對於包含文件的目錄(減去斜杠前綴)。(與在伺服器上下文中使用時不同,當匹配的 URL 路徑是文件根相對 URL 路徑時,以斜杠開頭。)RewriteRule ^\/customer\/index.php``.htaccess

您還需要QSD第一條規則上的標誌來丟棄原始請求中的查詢字元串,否則按原樣傳遞。

次要點…在 Apache 正則表達式中不需要反斜杠轉義斜杠,因為空格是參數分隔符,而斜杠在正則表達式中沒有特殊含義。

請嘗試以下操作:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^rp=/knowledgebase/
RewriteRule ^customer/index\.php$ /knowledgebase/ [QSD,R=301,L]

RewriteRule ^customer/knowledgebase\.php$ /knowledgebase/ [R=301,L]

我將查詢字元串錨定在條件中,以便它rp=...在查詢字元串的開頭匹配,如您的範例所示。.*不需要正則表達式末尾的。

QSA第二條規則不需要該標誌,因為預設情況下會傳遞查詢字元串。QSA僅當您需要請求中的原始查詢字元串與您在替換中附加的新查詢字元串合併時才需要該標誌。

<IfModule>包裝器不是必需的,除非這些指令是可選並且旨在用於 mod_rewrite 可能不可用的多個伺服器上。在網站管理員堆棧上查看此問題:https ://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessary

您應該首先使用 302(臨時)重定向進行測試,以避免潛在的記憶體問題。


**更新:**為簡單起見,我將重寫規則放在.htaccess文件中,/customer而不是/. 我已經相應地更新了我的文章。

在這種情況下,您需要刪除每個patternscustomer/上的前綴,就像您在更新的問題中所做的那樣。RewriteRule

如果rpURL 參數旨在匹配查詢字元串中的任何位置,那麼您應該將CondPattern更改為 read (^|&)rp=/knowledgebase/,而不是簡單地刪除^前綴。通過刪除^前綴,您可能匹配太多,例如。abcrp=/knowledgebase/...也會匹配,儘管這在現實中可能是也可能不是問題。

否則,這些更新的指令看起來沒問題,這取決於可能與其他指令存在的任何其他衝突。記憶體也可能是一個問題,尤其是在您使用 CDN 時。

引用自:https://serverfault.com/questions/1075298