私は次のことを試しています
RewriteMap lookup "txt:D:/lookup.txt"
RewriteCond %{REQUEST_URI} ^/${lookup}
RewriteRule ^/(.*)/(.*)$ /a/$1/b/$2.html [PT,L]
リクエストパスが有効なパスで始まっているかどうかを比較しようとしています。
ルックアップ ファイルには長いパスのリストがあります。
これについて助けてください。
答え1
正規表現には変数を使用できないことがわかりました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