我在这里遇到了一些烦人的情况。
我有一台由 plesk 管理的服务器。在 /etc/apache2/apache2.conf 中进行基于 mod_headers 和 mod_expires 的配置。例如:
<filesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</filesMatch>
这工作得很好。
我的一些应用程序有问题。如果需要,我想让应用程序保持对缓存的控制。目前这是不可能的,因为标头设置会在将响应返回给客户端之前立即进行,这意味着在应用程序完成所有操作之后。应用程序设置的标头将被覆盖。
Header merge Cache-Controll...
虽然不起作用,因为它只是附加给定的标题字符串。我怀疑浏览器是否会像我希望的那样处理这样的标头:
Cache-Control max-age=0, no-cache, no-store, must-revalidate, max-age=604800, public
我现在的问题是:是否只有在特定标题“字段”中绝对没有内容时才可以设置标题?我不希望我的应用程序设置任何环境变量,因为不应更改应用程序以满足一台服务器的需要。
我还尝试 - 仅用于测试目的 - 通过 vhost.conf 为特定域取消设置标头。但它在 apache2.conf 中的标头设置之前执行,这意味着它们也会被覆盖。
阿帕奇 2.4.7:
低于 Apache 2.2.4
我认为您可以使用
Header edit
. 秘诀是一个否定的前瞻性断言:这个想法是,如果标题中的任何地方都不存在
^(?!.*max-age.*)(.*)
该字符串,则匹配标题值的开头。max-age
如果匹配成功(意味着“max-age”不存在),它会插入“max-age=604800”,然后是原始标头的其余部分。编辑: Apache 使用 PCRE,因此您可能需要在替换字符串中使用
$1
而不是。\1