我花了好几个小时试图让一个简单的重写工作,我对mod_rewrite的基本理解一定有错误:
我想要一个执行以下替换的规则:
www.example.com/fr/ -> www.example.com/?lang=fr
我工作过,但是对于子目录:
www.example.com/fr/other/directories/ -> www.example.com/other/directories/?lang=fr&lang=fr&lang=fr
似乎规则对每个子目录都应用一次(它应该只应用一次)
此外,没有尾部斜杠的请求会导致另一个lang=fr
附加到查询字符串
该规则位于< VirtualHost>而不是在<目录>标签
RewriteRule ^ /(en | fr | zh | gr | it)/(。*)$ / $ 2?lang = $ 1 [QSA]
我也在使用DocumentIndex /index.php index.php
指令
非常感谢。
答案 0 :(得分:0)
可以尝试在/
之后的第二次重写中添加$s2
来尝试额外添加。
并尝试将[L]
添加到条件中,可能会阻止它重复遍历每个目录。
RewriteRule ^/(en|fr|zh|gr|it)/(.*)$ /$2/?lang=$1 [QSA,L]
但是,我听说{h}在htaccess中反对在httpd.conf中时[L]
的行为有所不同 - 我恐怕不是专家。
答案 1 :(得分:0)
要确定只有在以下情况下添加此条件后才会应用RewriteRule:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^/(en|fr|zh|gr|it)/(.*)$ /$2?lang=$1 [QSA,L]
因为mod-rewrite所做的任何内部重定向(即使使用[L]
标签,你也会有很多内容)会改变REDIRECT_STATUS
envirronement变量。
[L]
标记表示如果您有其他规则,请停止rewriteRule链。但是,目录中的mod-rewrite重写结果将始终针对其新目标进行测试(此处新目标是同一目录),并且将对重写内容应用规则,就像它是一个新目录一样(除了这个env变量已设置好。