0

我在一个方案中有 URL

/([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

用户应该被重定向到

/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]
4

1 回答 1

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

于 2013-04-19T09:54:37.217 回答