我正在 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
在这方面似乎没有任何有意义的记录?)。因此,当映射文件不存在时让服务器无法启动似乎是更好的选择(即使删除映射文件之后不会导致“错误”)。