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