Apache mod_rewrite 規則順序混亂

Apache mod_rewrite 規則順序混亂

我正在嘗試設定一些簡單的規則,根據路徑和查詢字串的位元重寫舊版本網站的 URL。

第一擊看起來像這樣:

RewriteEngine on

RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?

這似乎對/free_item.phpURL 很有用,可以正確取代 的結果RewriteMap,但/item.phpURL 只傳回重定向 URL 的第一部分,忽略了尋找結果RewriteMap。如果我顛倒了規則的順序,失敗/工作的 URL 就會顛倒過來。正如我一直理解的RewriteRule語法一樣,如果 URL 路徑與模式不匹配,則會跳過該規則並繼續處理下一個規則。在這種情況下,

我最終設法將其分成兩個塊,使其正常工作:

RewriteEngine on

RewriteMap freeitems txt:/www/www.example.com/etc/freeitems_map.txt
RewriteMap items txt:/www/www.example.com/etc/items_map.txt

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}?

RewriteCond %{QUERY_STRING} ^sku=(\d+)$
RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}?

誰能告訴我為什麼第一種技術失敗了?

編輯:作為測試,我為第二個 .txt 檔案的重定向 URL 新增了一個額外的路徑元素RewriteRule。當我請求一個應與第二條規則而不是第一條規則相符的 URL 時,該路徑元素會如預期顯示。只是不是查找的結果RewriteMap

謝謝!

-本

答案1

第一種技術失敗的原因是第二個 RewriteRule 上的 RewriteCond %1 向後引用不存在。每個RewriteRule都有自己的一組RewriteCond,且不與其他RewriteRule區塊共用RewriteCond。

看:http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#InternalRuleset

我還建議添加 [L] 標誌,因為看起來每個規則都是獨立的。例如:

RewriteRule ^/free_item.php$ https://www.example.com/shop/detail/${freeitems:%1}? [L]

RewriteRule ^/item.php$ https://www.example.com/shop/detail/${items:%1}? [L]

祝你好運 :)

相關內容