我正在嘗試以下操作
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