Apache “使用文本重写映射”选项始终不返回任何结果

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

我将自我回答这个问题,因为我遇到了它,并且找不到一个谷歌结果来帮助我,所以希望这可以为未来的人节省一些时间

在Apache2.2中,我有一个类似这样的重写映射,如果存在特定的查询字符串参数,则重定向到url:

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
)时,映射运行良好