在 RewriteCond 中使用 RewriteMap 尋找。可能的?

在 RewriteCond 中使用 RewriteMap 尋找。可能的?

我正在嘗試以下操作

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

相關內容