Apache “使用文本重写映射”选项始终不返回任何结果
我将自我回答这个问题,因为我遇到了它,并且找不到一个谷歌结果来帮助我,所以希望这可以为未来的人节省一些时间 在Apache2.2中,我有一个类似这样的重写映射,如果存在特定的查询字符串参数,则重定向到url:Apache “使用文本重写映射”选项始终不返回任何结果,apache,mod-rewrite,apache2.2,Apache,Mod Rewrite,Apache2.2,我将自我回答这个问题,因为我遇到了它,并且找不到一个谷歌结果来帮助我,所以希望这可以为未来的人节省一些时间 在Apache2.2中,我有一个类似这样的重写映射,如果存在特定的查询字符串参数,则重定向到url: RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt" RewriteCond %{QUERY_STRING} (^|&)foo=([^&]+) [NC] RewriteCond ${redire
RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt"
RewriteCond %{QUERY_STRING} (^|&)foo=([^&]+) [NC]
RewriteCond ${redirect:%1} !^$
RewriteRule ^.*$ ${redirect:%1} [301,L]
和/etc/arbirry1/arbirry2/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的格式无关。我的发现见下文。因此问题最终是中间目录/etc/arbitray1
没有www data
用户的执行权限。这花费了这么长时间才发现的原因显然是,来自root的suid发生在检查文件存在之后。也就是说,如果我将RewriteMap redirect“txt:/etc/arbitrary1/arbitrary2/redirect.txt”
更改为RewriteMap redirect“txt:/etc/arbitrary1/arbitrary2/doesnotexist.txt”
,Apache将在重新启动时给出一个错误,这表明它在加载配置时在stating/etc/arbitrary1/arbitrary2/redirect.txt
上没有问题。因为Apache是在启动时找到它的,所以我假设它也可以在执行期间访问它(这是一个错误的假设)。当我给/etc/arbirry1
一个匹配www数据的execute perm(使用chown www-data:www-data/etc/arbirry1
或chmod o+x/etc/arbirry1
)时,映射运行良好