Dot-Htaccess
如何防止 RewriteRules 衝突
我正在嘗試實現三個 RewriteRules,但我無法讓所有三個 RewriteRules 一起工作:
RewriteRule ^products$ http://%{SERVER_NAME}/en_ca/products [L,R=301] RewriteRule ^products/(.*)$ http://%{SERVER_NAME}/en_ca/$1 [L,R=301] RewriteRule ^products/(.*)/(.*)$ http://%{SERVER_NAME}/en_ca/$2 [L,R=301]
我想要實現的目標如下:
- www.domain.com/products > www.domain.com/en_ca/products
- www.domain.com/products/product-name > www.domain.com/en_ca/product-name
- www.domain.com/products/cat/product-name > www.domain.com/en_ca/product-name
我可以讓 1 和 2 工作,但 2 阻止 3 工作。有沒有辦法確保 URL 有 3 個部分,或者有更好的方法來做到這一點?
謝謝
# rule 1 RewriteRule ^products/?$ /en_ca/products [L,R=301] # rule 2 RewriteRule ^products/([^/]+)/?$ /en_ca/$1 [L,R=301] # don't use this one since it would allow for greater than 2 / # products/cat/cat_food/diners will write: en_ca/cat_food/diners # RewriteRule ^products/(.*)/(.+)$ /en_ca/$2 [L,R=301] # rule 3 # to be extra careful to only include 2 /, do it this way: RewriteRule ^products/([^/]+)/([^/]+)/?$ /en_ca/$2 [L,R=301]
那應該行得通。不要使用貪婪的 .*(任何東西,包括 /),使用限制
$$ ^/ $$*(除 / 之外的任何內容)。將 *(零或更多)更改為 +(等於或大於 1)也更安全。 我相信您可能在其他地方有錯誤,請查看此處發生的情況:
規則一:只取/products,改成:en_ca/products。後面的任何內容都不會觸發,因為現在路徑以 en_ca 開頭。順便重寫一下,你可以去掉:http://% {SERVER_NAME}。/en_ca/$1 就足夠了。
規則 2:取 /products/product_name 並將其重寫為:/en_ca/product_name 現在沒有其他規則將更改它,因為它不再以 products 開頭
規則 3 僅在路徑包含 2 / 並以產品開頭時才會觸發,因此規則 1 或 2 都不能創建將被第三條規則重寫的 url。
添加 /? (0 或 1 個斜杠)還可以保護您免受輸入 /products/ 或 products/product_name/ 的人的侵害