我在计划中有网址
/([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]
答案 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]
位确保考虑尾随数字。)