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

ser*_*com 5 rewrite redirect apache-2.2 apache-2.4

我正在尝试以下

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

我正在尝试比较请求路径是否以有效路径开头。

我在查找文件中有很长的路径列表。

请帮忙解决这个问题。

kri*_*sFR 6

我发现你不能在RewriteCond正则表达式中有一个变量,因为它似乎只编译一次,而不是每个请求。

您可以通过使用分隔符(假设是逗号)将${lookup}%{REQUEST_URI}放入测试字符串中来解决此问题,然后确保它们相等,例如:

RewriteCond %{REQUEST_URI},/${lookup:/$1/}/$2 ^([^,]+),\1
Run Code Online (Sandbox Code Playgroud)

另请注意,对于这个给定的示例 URL http://mydomain.dom/abc/mypage.html

%{REQUEST_URI} = /abc/mypage.html
Run Code Online (Sandbox Code Playgroud)

${lookup:$1} = abc
Run Code Online (Sandbox Code Playgroud)

所以%{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]
Run Code Online (Sandbox Code Playgroud)

http://mydomain.dom/abc/mypage.html给我以下日志:

(1) pass through /a/abc/b/mypage.html
Run Code Online (Sandbox Code Playgroud)