使用RewriteMap时,正确的Apache RewriteCond和RewriteRule?

时间:2017-04-06 18:26:00

标签: regex apache mod-rewrite rewritemap

我试图用一些apache配置来调试问题,但是在使用RewriteMap时我无法重写apache重写。

这是/etc/apache2/map.txt

中的内容
/21.html /1.html
/22.html www.localhost/2.html
www.localhost/23.html www.localhost/3.html
/23.html?blabla=bla /4.html

为了测试这个,我提供了一些带有小脚本的html页面:

#!/bin/bash

COUNTER=1

while [  $COUNTER -lt 20 ]; do
echo "<html>
<body>

<h1>PAGE NR $COUNTER</h1>

<p>My first paragraph.</p>

</body>
</html>" > /var/www/$COUNTER.html
let COUNTER=COUNTER+1 
done

我几乎尝试了在论坛/谷歌中找到的每一个版本,但没有一个可以让我的RewriteCond和RewriteRule工作。

我不知道我的虚拟主机内部的正确设置:

RewriteEngine on
RewriteMap map "/etc/apache2/map.txt"
RewriteCond ???????
RewriteRule ???????

我不太确定,但我想我应该有多个RewriteCond和RewriteRule来匹配地图文件中的所有不同的行。

另外,我真的不知道如何使用map文件中的值匹配Condition / Rule。在某些例子中,人们指的是1美元和2美元,而有些则不是。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

这些是使事情有效的条件/规则:

RewriteCond  %{REQUEST_URI}                 ^(/.*[^/])/?$
RewriteCond  %{QUERY_STRING}        !.+
RewriteCond  ${map:${lc:%1}|NOT_FOUND}    !NOT_FOUND
RewriteRule  .+  ${map:${lc:%1}}?                   [NC,L,R]

RewriteCond  %{REQUEST_URI}                 ^(/.*[^/])/?$
RewriteCond  %{QUERY_STRING}        ^.+
RewriteCond  ${map:${lc:%{REQUEST_URI}?%{QUERY_STRING}}|NOT_FOUND} !NOT_FOUND
RewriteRule  .+ ${map:${lc:%{REQUEST_URI}?%{QUERY_STRING}}} [NC,L,R]