mod_rewrite - 停止重复每个目录

时间:2011-10-29 15:14:50

标签: apache mod-rewrite

我花了好几个小时试图让一个简单的重写工作,我对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指令

非常感谢。

2 个答案:

答案 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变量已设置好。