
我正在嘗試設定一些簡單的規則,根據路徑和查詢字串的位元重寫舊版本網站的 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.php
URL 很有用,可以正確取代 的結果RewriteMap
,但/item.php
URL 只傳回重定向 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]
祝你好運 :)