我有一条将旧式网址翻译成新风格的规则。只要我在查询中使用相同的参数顺序,它就可以正常工作:
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
但问题是使用localhost / 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个参数,那么排列将使这个无法管理)
答案 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]