【问题标题】:mod_rewrite - stop repeating for each directorymod_rewrite - 停止对每个目录重复
【发布时间】:2011-12-17 21:23:46
【问题描述】:

我花了几个小时试图让一个简单的重写工作,我对 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 附加到查询字符串

该规则位于 中,而不是在 标记中

重写规则 ^/(en|fr|zh|gr|it)/(.*)$ /$2?lang=$1 [QSA]

我也在使用DocumentIndex /index.php index.php 指令

非常感谢。

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    为了确定一个 RewriteRule 只会在添加此条件之前应用一次:

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^/(en|fr|zh|gr|it)/(.*)$ /$2?lang=$1 [QSA,L]
    

    因为 mod-rewrite 进行的任何内部重定向(您将有很多,即使使用 [L] 标签)将更改 REDIRECT_STATUS 环境变量。

    [L] 标签意味着停止 rewriteRule 链,以防您那里有其他规则。但是您目录中的 mod-rewrite 重写的结果将始终针对他的新目的地进行测试(这里新目的地是同一个目录),并且规则将应用于重写的内容,就好像它是一个新的一样(除了此环境变量已设置)。

    【讨论】:

      【解决方案2】:

      可以尝试在 $s2 之后的第二次重写中添加 / 以试验额外的添加。 并尝试将[L] 添加到条件中,可能会阻止它在每个目录中重复。

      RewriteRule ^/(en|fr|zh|gr|it)/(.*)$ /$2/?lang=$1 [QSA,L]
      

      但是,我听说 [L] 在 htaccess 中的行为与在 httpd.conf 中的行为不同 - 恐怕我不是这方面的专家。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 2020-08-25
        • 2016-08-31
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2014-01-07
        相关资源
        最近更新 更多