0

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

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 个参数,那么排列会使这变得难以管理)

4

1 回答 1

0

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

RewriteCond 反向引用:这些是 %N (0 <= N <= 9) 形式的反向引用。%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]
于 2012-12-04T23:55:11.843 回答