代码之家  ›  专栏  ›  技术社区  ›  Daniel Sloof

如何在mod重写规则中保留现有查询字符串

  •  4
  • Daniel Sloof  · 技术社区  · 16 年前

    我试图重写以下网址:

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

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

    但是,根据现有的$\u get变量,它必须是?语言或语言。

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

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

    第二个按预期工作…然而,第一个从来没有被击中(它落在第二个雷吉,这确实击中),即使雷吉教练告诉我,它应该。

    编辑:

    如果只是读到,我需要用两个反斜杠来避开问号。如果我这样做,它会碰到第一个regex,但不会找到其他get变量。

    2 回复  |  直到 16 年前
        1
  •  9
  •   mikej heading_to_tahiti    16 年前

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

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

    RewriteRule ^([a-z]{2})/(.*) /$2?language=$1 [QSA]
    
        2
  •  0
  •   anonymous coward    16 年前

    您可以设置url rewrite,通过$_server superglobal的path_info元素将语言传递给php脚本。只需像这样将语言传递给脚本:

    foobar.php/en?args
    

    在这种情况下,$服务器[路径信息]等于/en