根据路径和查询字符串,使用mod_rewrite比较和重写URL

时间:2012-11-08 12:18:54

标签: mod-rewrite

我在计划中有网址

/([0-9]*)/some/path/script.jsf?someId=([0-9]*)

如果$ 1与$ 2不匹配,我想将用户重定向到$ 2。例如,如果用户请求

/1/some/path/script.jsf?someId=1

everthing很好,不应该重定向用户,但如果用户请求

/1/some/path/script.jsf?someId=2

用户应该被重定向到

/2/some/path/script.jsf?someId=2

我尝试过这条规则:

RewriteCond %{REQUEST_URI} ^/([0-9]*)/
RewriteCond %{QUERY_STRING} someId=([0-9]*)
RewriteCond %1 !%2
RewriteRule (.*) /%2/some/path/script.jsf?someId=%2 [R]

但%2似乎总是空的。所以我试过这条规则:

RewriteCond %{REQUEST_URI} ^/([0-9]*)/some/path/script.jsf?someId=([0-9]*)
RewriteCond %1 !%2
RewriteRule (.*) /%2/)/some/path/script.jsf?someId=%2 [R]

1 个答案:

答案 0 :(得分:0)

%n仅访问

的反向引用
  

当前条件中最后一个匹配的RewriteCond

这就是为什么你的%2在你的第一套规则中似乎总是空着的。

您的第二次尝试解决了RewriteCond %1 !%2的此问题,但您无法在%2中引用RewriteRule,因为它再次引用了匹配RewriteCond

如果您正在运行Apache 2,那么使用负前瞻断言可以使用非常简单的方法:

RewriteRule ^/([0-9]*)/some/path/script.jsf?someId=(?!$1(?:$|[^0-9]))([0-9]*) /$2/some/path/script.jsf?someId=$2 [R]

重要的部分是

(?!$1(?:$|[^0-9]))

断言下一个字符序列不能完全是$1中的数字。 ($|[^0-9]位确保考虑尾随数字。)