在 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

相关内容