Mod rewrite 基于路径和查询字符串将URL与mod_rewrite进行比较和重写

Mod rewrite 基于路径和查询字符串将URL与mod_rewrite进行比较和重写,mod-rewrite,Mod Rewrite,我有一个方案的网址 /([0-9]*)/some/path/script.jsf?someId=([0-9]*) 如果$1与$2不匹配,我想将用户重定向到$2。例如,如果用户请求 /1/some/path/script.jsf?someId=1 /1/some/path/script.jsf?someId=2 一切都很好,用户不应该被重定向,但是如果用户请求 /1/some/path/script.jsf?someId=1 /1/some/path/script.jsf?someId=2

我有一个方案的网址

/([0-9]*)/some/path/script.jsf?someId=([0-9]*)
如果$1与$2不匹配,我想将用户重定向到$2。例如,如果用户请求

/1/some/path/script.jsf?someId=1
/1/some/path/script.jsf?someId=2
一切都很好,用户不应该被重定向,但是如果用户请求

/1/some/path/script.jsf?someId=1
/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]
RewriteCond %{REQUEST_URI} ^/([0-9]*)/some/path/script.jsf?someId=([0-9]*)
RewriteCond %1 !%2
RewriteRule (.*) /%2/)/some/path/script.jsf?someId=%2 [R]
但是%2似乎总是空的。所以我试过这个规则:

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

%n
仅访问来自

当前条件集中最后匹配的
RewriteCond

这就是为什么您的
%2
在第一组规则中总是显得空的原因

您的第二次尝试解决了
RewriteCond%1!%的此问题2
,但您不能在
重写规则
中引用
%2
,因为它再次引用上次匹配的
重写条件

如果您正在运行Apache2,有一种非常简单的方法可以使用负前瞻断言来实现这一点:

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]
位确保考虑尾随数字。)