![如何防止 RewriteRules 冲突](https://linux22.com/image/670954/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%20RewriteRules%20%E5%86%B2%E7%AA%81.png)
我试图实现三条 RewriteRule,但是无法让它们协同工作:
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/产品名称 > www.domain.com/en_ca/产品名称
- www.domain.com/products/cat/产品名称 > www.domain.com/en_ca/产品名称
我可以让 1 和 2 工作,但 2 会阻止 3 工作。有没有办法确保 URL 有 3 个部分,或者有没有更好的方法来实现这一点?
谢谢
答案1
# 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 个或更多)也更安全。
我相信你可能在其他地方犯了错误,请检查一下这里发生的情况:
规则 1:仅取 /products,并将其更改为:en_ca/products。后面的任何内容都不会触发,因为现在路径以 en_ca 开头。您可以删除:http://%顺便说一下,重写中的 {SERVER_NAME}。/en_ca/$1 就足够了。
规则 2:将 /products/product_name 重写为:/en_ca/product_name 现在没有其他规则可以改变它,因为它不再以 products 开头
仅当路径包含 2 / 并以 products 开头时,规则 3 才会触发,因此规则 1 和 2 都无法创建将被第 3 条规则重写的 URL。
添加 /?(0 个或 1 个尾部斜杠)还可以保护您免受输入 /products/ 或 products/product_name/ 的人的侵害