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、最初の一連のルールで常に空に見えます。

2 回目の試行で のこの問題を回避できますが、最後に一致した を参照しているため、 でRewriteCond %1 !%2を参照することはできません。%2RewriteRuleRewriteCond

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 に答える