3

次のような特定のアプリケーション ID にユーザー ID を関連付けたい:

<user_id> <app_id>  
615 1
616 7
617 3
618 3    

私のURIは次のようになります:

/<app_id>/<user_id>/...

ここで、ユーザーのブックマークに影響を与えずにアプリケーションを簡単に変更できるようにしたいと考えています。私の例では、両方が必要です

/1/615/index.html or /3/615/index.html

として奉仕する

/1/615/index.html

次のルールでは、無限ループが発生します。

RewriteMap map dbm:user-application.map
RewriteRule ^/([0-9]+)/([0-9]+)/(.*)$ /${map:$2}/$2/$3 [R,L]              
...
#other proxy code to forward request to applications

リダイレクト後、Apache は常に同じルールを実行することを理解しています。次に、次のように、ループをブロックする書き換え条件を追加しようとしました

RewriteMap map dbm:user-application.map
RewriteCond %{REQUEST_URI} !^/${map:$2}
RewriteRule ^/([0-9]+)/([0-9]+)/(.*)$ /${map:$2}/$2/$3 [R,L]              

書き換えログを正しく読むと、条件パターンで変数 !^/${map:$2} が置き換えられず、「そのまま」チェックされていることがわかります。そして、条件は常に真であり、それでも無限ループが発生します。

アプリケーション ID がマップと一致するとすぐにループをブロックするアイデアはありますか?

4

1 に答える 1

1

/3/615/index.html は /1/615/index.html に正しくリダイレ​​クトされます

問題は、/1/615/index.html を /1/615/index.html にもリダイレクトしていることです。マップ変換がノーオペレーションであるケースを検出し、その中でまったくリダイレ​​クトしないようにする必要があります場合。

ユーザー向けの URL を気にしない場合は、[R,L] を [L] に変更する (R を削除する) だけで、クライアントからの新しいラウンドトリップがトリガーされないため、問題ありません。

$2 後方参照が RewriteCond 式で機能しないことは間違いありません。これは、RewriteRule がまだ評価されていないためです。%n - 前の RewriteCond の正規表現へのスタイルの後方参照を使用できる場合があります...

RewriteCond {%REQUEST_URI} ^/([0-9]+)/
RewriteCond {%REQUEST_URI} !^/${map:%1}

しかし、私はこれをテストしていないので、YMMV.

于 2014-10-15T22:00:19.730 に答える