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)
我正在尝试比较请求路径是否以有效路径开头。
我在查找文件中有很长的路径列表。
请帮忙解决这个问题。
我发现你不能在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)
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |