我这里遇到了一点烦人的情况。
我有一台由 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 中的标头设置之前执行,这意味着它们也会被覆盖。
答案1
我认为你可以使用 来实现这一点Header edit
。秘诀是前瞻否定断言:
Header edit Cache-control "^(?!.*max-age.*)(.*)" "max-age=604800,\1"
其思想是,^(?!.*max-age.*)(.*)
如果字符串在标头中不存在,则匹配标头值的开头max-age
。如果匹配成功(即“max-age”不存在),则插入“max-age=604800”,然后插入原始标头的其余部分。
编辑:Apache 使用 PCRE,因此您可能需要在替换字符串中使用$1
而不是。\1
答案2
Apache 2.4.7:
Header setifempty Access-Control-Allow-Origin "*"
Apache 2.2.4 以下
Header append Access-Control-Allow-Origin ""
Header edit Access-Control-Allow-Origin "^$" "*"