Dot-Htaccess

如何防止 RewriteRules 衝突

  • November 13, 2015

我正在嘗試實現三個 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]

我想要實現的目標如下:

  1. www.domain.com/products > www.domain.com/en_ca/products
  2. www.domain.com/products/product-name > www.domain.com/en_ca/product-name
  3. 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/ 的人的侵害

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