web-dev-qa-db-ja.com

RewriteCondでのRewriteMapルックアップの使用。可能?

私は以下を試しています

RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]

リクエストパスが有効なパスで始まっているかどうかを比較しようとしています。

ルックアップファイルにパスの長いリストがあります。

これを手伝ってください。

5

RewriteCond正規表現に変数を含めることはできないことを発見しました。これは、リクエストごとではなく、一度だけコンパイルされるように見えるためです。

${lookup}%{REQUEST_URI}の両方を区切り文字(コンマなど)を使用してテスト文字列に入れ、それらが等しいことを確認することで、これを回避できます。例:

RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1

また、この特定のサンプルURL http://mydomain.dom/abc/mypage.html

%{REQUEST_URI} = /abc/mypage.html

だが

${lookup:$1} = abc

したがって、%{REQUEST_URI}${lookup:$1}と等しくなることはありません。

要求されたときにそれらを等しくするには、次のことを行う必要があります。

  • ${lookup:$1}/で囲んで、/abc/ = /${lookup:$1}/を取得します。
  • $2を追加して、要求されたファイルも取得します:/abc/mypage.html = /${lookup:$1}/$2
  • キーは/abc/abcではない)であるため、キーと一致するように$1/で囲む必要があります:/${lookup:/$1/}/

だから最後にあなたはこれを持っているでしょう:

RewriteMap lookup "txt:/var/www/lookup.txt"
RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2 [R=301]

http://mydomain.dom/abc/mypage.htmlに移動すると、次のログが表示されます。

(1) pass through /a/abc/b/mypage.html
6
krisFR