我正在尝试以下
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