如何处理丢失的 RewriteMap 文件?

如何处理丢失的 RewriteMap 文件?

我正在 Apache httpd 配置中定义一个RewriteMap。(这工作正常。)

RewriteMap redirects-list txt:/path/to/redirects.txt

但是当地图文件(/path/to/redirects.txt)不存在时,服务器将抛出错误:

RewriteMap:未找到映射重定向列表的文件:/path/to/redirects.txt

我想让它具有容错功能,RewriteMap当且仅当文件存在时才会设置。

(例如,如果它不存在,也许有一种方法可以自动使用后备,即类似的空白文件/dev/null。)

我将非常感激您的帮助。

答案1

使用真正的空文件或带有注释的文件。Apache 将识别对文件的更改,而无需重新加载/重新启动。

https://httpd.apache.org/docs/2.4/rewrite/rewritemap.html#txt

缓存查找

查找到的键会被 httpd 缓存,直到 mapfile 的 mtime(修改时间)发生变化,或者 httpd 服务器重新启动。这可确保在被大量请求调用的 map 上获得更好的性能。

缺少 RewriteMap 文件是一个错误(apachectl configtest),/dev/null文件可以工作,但样式不好。在这种情况下,最好在配置中注释掉这些行。

答案2

似乎没有办法设置RewriteMap 有条件的RewriteMap。我尝试使用 Apache 表达式在指令中设置<If>来检查文件是否存在。例如:

<If "-f '/path/to/redirects.txt'">
    RewriteMap redirects-list txt:/path/to/redirects.txt
</If>

但是,这在语法上是无效的,并且服务器将无法启动并出现错误:

这里不允许使用 RewriteMap

如前所述,您应该在(重新)启动 Apache 服务器之前测试配置。


值得注意的是,如果有依赖指令使用此指令(不存在),RewriteMap那么这些指令将默默失败。(即使LogLevel rewrite:trace6在这方面似乎没有任何有意义的记录?)。因此,当映射文件不存在时让服务器无法启动似乎是更好的选择(即使删除映射文件之后不会导致“错误”)。

相关内容