2017-05-18 75 views
0

我要自己回答这个问题,因为我碰到它并找不到一个Google结果来帮助,所以希望这可以节省一些未来的人一些时间。带文本选项的RewriteMap总是返回没有结果

在APACHE2.2,我有塑造这样一个RewriteMap指令,重定向到URL如果一个特定的查询字符串参数存在:

RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt" 

RewriteCond %{QUERY_STRING} (^|&)foo=([^&]+) [NC] 
RewriteCond ${redirect:%1} !^$ 
RewriteRule ^.*$ ${redirect:%1} [301,L] 

而且/etc/arbitrary1/arbitrary2/redirect.txt

foo http://hello.invalid/somepath/1 # 1 
bar http://hello.invalid/somepath/2 # 2 
baz http://hello.invalid/somepath/3 # 3 

问题我遇到过,无论我使用哪一个“foo,bar,baz”,${redirect:%1}指令都会返回空白(即“不匹配”)。这与redirect.txt的格式无关。请参阅以下我发现的内容。

回答

0

所以问题最终导致中间目录/etc/arbitrary1www-data用户没有执行权限。这个花了很长时间才发现的原因是,显然,根源发生在之后检查文件存在。也就是说,如果我将RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt"更改为RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/doesnotexist.txt",Apache将在重新启动时发生错误,这表明在加载配置时它没有任何问题,因此无法设置/etc/arbitrary1/arbitrary2/redirect.txt。因为Apache在开始时发现它,所以我认为它在执行期间也可以访问它(这是一个糟糕的假设)。当我给/etc/arbitrary1一个匹配万维网数据(与chown www-data:www-data /etc/arbitrary1chmod o+x /etc/arbitrary1)匹配的执行perm时,地图工作正常。