10

我想使用 apache 的 mod_expires 模块设置缓存头。我的配置看起来有点像这样:

<LocationMatch ^/static >
    ExpiresDefault "access plus 1 years"
</LocationMatch>

问题是,这些文件是由我无法控制的第三个系统生成的。这些系统提供具有以下标题的文件:

Date Mon, 24 Oct 2011 08:39:02 GMT
Cache-Control no-cache,no-store,must-revalidate
Pragma no-cache
Expires Thu, 01 Dec 1994 16:00:00 GMT

这些标头使得无法使用 mod_expires 设置缓存标头。http://httpd.apache.org/docs/2.2/mod/mod_expires.html告诉我们原因:

当 Expires 标头已经是服务器生成的响应的一部分时,例如当由 CGI 脚本生成或从源服务器代理时,此模块不会更改或添加 Expires 或 Cache-Control 标头。

是否有任何可能的方法来规避此规则并用 mod_expires 覆盖标头?

更新: 避免此限制的一种可能解决方案是仅使用 mod_headers 来设置缓存头。不幸的是,这不是替代方案,因为必须计算值。

提前谢谢它。

4

3 回答 3

4

不幸的是,这是一个已知的限制,我们不得不回退到仅使用mod_headers.

于 2012-11-19T10:15:25.653 回答
1

Regilero 的建议不起作用,因为标头指令将在响应处理的后期处理 - aftermod_expire指令。所以你会在mod_expires做了(或没有)它应该做的事情之后取消设置标题。

如果是 apache 2.2,您可以尝试将其放在early每个标头指令的末尾。这将告诉它在响应处理的早期而不是在结束时执行此操作。

所以试试:

<LocationMatch ^/static >
  Header unset Cache-Control early
  Header unset Pragma early
  Header unset Expires early
  ExpiresDefault "access plus 1 years"
</LocationMatch>

还没有测试过,但试一试...

于 2011-11-18T17:06:30.037 回答
0

您是否尝试将其与mod_headers混合?

<LocationMatch ^/static >
  Header unset Cache-Control 
  Header unset Pragma
  Header unset Expires 
  ExpiresDefault "access plus 1 years"
</LocationMatch>

未经测试,但如果...

于 2011-10-29T20:01:40.427 回答