我将自己回答这个问题,因为我遇到了这个问题,并且找不到一个Google结果来帮助我,所以希望这可以节省一些未来的人一些时间。
在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
的格式无关。关于我的发现,请看下面。
发布于 2017-05-19 06:18:57
所以问题最终是中间目录/etc/arbitrary1
没有www-data
用户的execute权限。花了这么长时间才发现的原因是,显然,来自root的suid是在检查文件是否存在之后执行的。也就是说,如果我将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
一个匹配www-data (使用chown www-data:www-data /etc/arbitrary1
或chmod o+x /etc/arbitrary1
)的execute perm时,映射工作得很好。
https://stackoverflow.com/questions/44058645
复制相似问题