带文本选项的RewriteMap始终不返回任何结果

时间:2017-05-18 22:18:57

标签: apache mod-rewrite apache2.2

我会自行回答这个问题,因为我遇到了这个问题而无法找到单一的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的格式无关。请参阅下面我发现的内容。

1 个答案:

答案 0 :(得分:0)

所以问题最终是中间目录/etc/arbitrary1没有www-data用户的执行权限。这花了这么长时间才发现的原因是,显然,在检查文件存在之后,来自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/arbitrary1chmod o+x /etc/arbitrary1时),地图运行正常。