没有特定顺序的Apache mod_rewrite查询字符串

时间:2012-12-01 18:33:54

标签: apache mod-rewrite

我有一条将旧式网址翻译成新风格的规则。只要我在查询中使用相同的参数顺序,它就可以正常工作:

RewriteCond %{QUERY_STRING} ^country=([a-z]{2})&id=([0-9]+)$ [NC]
RewriteRule ^(.*)$ http://%1.localhost/%2? [R=301,L]

所以url localhost / index.php?country = us& id = 1234会转到us.localhost / 1234

但问题是使用l​​ocalhost / index.php?id = 1234& country = us(请注意,参数现在按顺序交换),那么规则当然不适用。

我考虑过更改规则来单独处理参数,如下所示:

RewriteCond %{QUERY_STRING} country=([a-z]{2}) [NC]
RewriteCond %{QUERY_STRING} id=([0-9]+) [NC]
RewriteRule ^(.*)$ http://%1.localhost/%2? [R=301,L]

但是当输入localhost / index.php?id = 1234& country = us时,我得到1234.localhost / us这不是我的预期(我希望第一个cond能给我%1和第二个cond%2但是似乎订单没有这样确定)

有没有简单的方法来实现这一目标?当然,我可以写两个单独的规则,每个处理每个案例,但是想知道是否可以使用一些通用方法(想想如果我们有3个参数,那么排列将使这个无法管理)

1 个答案:

答案 0 :(得分:0)

从文档中看,您似乎只能引用上一场比赛中的规则:

RewriteCond反向引用:这些是%N形式的反向引用(0 <= N <= 9)。 %1到%9提供对模式的分组部分(同样,在括号中)的访问,来自当前条件集中最后匹配的RewriteCond 。 %0提供对该模式匹配的整个字符串的访问。

我一直绞尽脑汁想要做到这一点,我能想到的最好的方法就是使用多个规则将数据提取到环境变量中,然后在最后重写这些规则以进行最后的重写。 / p>

这样的事情:

RewriteCond %{QUERY_STRING} country=([a-z]{2}) [NC]
RewriteRule ^(.*)$ - [E=URL_COUNTRY:%1]

RewriteCond %{QUERY_STRING} id=([0-9]+) [NC]
RewriteRule ^(.*)$ - [E=URL_ID:%1]

RewriteRule ^(.*)$ http://%{ENV:URL_COUNTRY}.localhost/%{ENV:URL_ID}? [R=301,L]