【问题标题】:How do I preserve the existing query string in a mod_rewrite rule如何在 mod_rewrite 规则中保留现有的查询字符串
【发布时间】:2009-10-06 21:16:39
【问题描述】:

我正在尝试从以下位置重写 url:

http://domain.com/aa/whatever/whatever.php

http://domain.com/whatever/whatever.php?language=aa

但是,根据现有的 $_GET 变量,它必须是 ?language 或 &language。

为此,我使用了 2 个带有 [L] 标志的正则表达式:

RewriteRule ^([a-z]{2})/(.*\.php\?.*) /$2&language=$1 [L]
RewriteRule ^([a-z]{2})/(.*) /$2?language=$1 [L]

第二个按预期工作......但是第一个从未被命中(它落入第二个正则表达式,它确实命中),即使 Regex Coach 确实告诉我它应该。

编辑:

如果只是读到我需要使用两个反斜杠来转义问号。如果我这样做,它会命中第一个正则表达式,但永远找不到其他 GET 变量。

【问题讨论】:

    标签: regex .htaccess mod-rewrite


    【解决方案1】:

    documentation for mod_rewrite 开始,RewriteRule 中的模式与主机名和端口之后、查询字符串之前的 URL 部分匹配,因此不包括查询字符串。这就是为什么你没有得到其他变量的原因。

    要添加新的查询字符串参数language=xx,同时保留任何现有的查询字符串,您需要使用 QSA 标志(查询字符串追加)。使用此标志,仅基于您的第二种情况的一条规则就足够了:

    RewriteRule ^([a-z]{2})/(.*) /$2?language=$1 [QSA]
    

    【讨论】:

    • 在我阅读答案之前找到了它,但它仍然是正确的答案。
    • 感谢您接受答案,即使您自己找到了答案。
    【解决方案2】:

    您可以设置 URL 重写以通过 $_SERVER 超全局的 PATH_INFO 元素将语言传递给 php 脚本。只需像这样将语言传递给脚本:

    foobar.php/en?args
    

    在这种情况下,$_SERVER[PATH_INFO] 将等于 /en

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 2018-05-11
      • 1970-01-01
      • 2014-06-09
      • 2011-06-02
      • 2011-05-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多