2012-12-01 39 views
0

我有一个规则,将旧式的网址翻译成新的风格。它的工作原理确定只要我使用的参数相同的顺序查询:Apache mod_rewrite查询字符串没有特定的顺序

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

所以URL本地主机/ index.php的国家= 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] 

但进入本地主机/ index.php文件ID = 1234 &国时= US我得到1234.localhost /我们是不是我所期望的(我期望第一个cond给我%1和第二cond%2,但它似乎不是这样确定的顺序)

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

回答

0

从文档看来,仅参考上次匹配的规则:

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

我一直在绞尽脑汁做一个好的方法来做到这一点,我可以提出的最好的方法是使用多个规则将数据提取到环境变量中,然后在最后引用这些数据以进行最终重写。

事情是这样的:

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] 
相关问题