使用mod_expires覆盖缓存标头

时间:2011-10-28 13:50:28

标签: apache mod-expires

我想使用apache中的mod_expires模块设置cache-headers。我的配置看起来像这样:

<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来设置缓存标头。不幸的是,这不是一个替代方案,因为必须计算这些值。

谢谢它的推进。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

Regilero的建议不会起作用,因为在mod_expire指令之后,在响应处理中很晚将处理头指令。因此,在mod_expires完成(或没有)它应该做的事情后,你取消设置标题。

如果是apache 2.2,你可以尝试将early放在每个header指令的末尾。这将告诉它在响应处理的早期阶段而不是在结束时这样做。

所以试试:

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

Haven没有测试过,但是试一试......

答案 2 :(得分:0)

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

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

未经测试,但如果......