如何在mod_rewrite规则中保留现有查询字符串

时间:2009-10-06 12:28:22

标签: regex .htaccess mod-rewrite

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

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

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

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

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

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

第二个按预期工作......然而,第一个没有被击中(它落到第二个正则表达式,确实命中),即使Regex Coach确实告诉我它应该。

编辑:

如果只是读到我需要使用两个反斜杠来逃避问号。如果我这样做,它确实击中了第一个正则表达式,但从未找到其他GET变量。

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:0)

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

foobar.php/en?args

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

相关问题