Apache:ExpiresDefault不起作用,而“Header”起作用。怎么会这样?

Apache:ExpiresDefault不起作用,而“Header”起作用。怎么会这样?,apache,httpd.conf,Apache,Httpd.conf,如果我这样做: <IfModule mod_expires.c> <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4|css|js|php)$"> ExpiresActive On ExpiresDefault "access plus 30 days" </FilesMatch> </IfModule> 它没有正确设置Expire标头,但是如果我手动强制它,如

如果我这样做:

<IfModule mod_expires.c>
  <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4|css|js|php)$">
    ExpiresActive On
    ExpiresDefault "access plus 30 days"
  </FilesMatch>
</IfModule>
它没有正确设置Expire标头,但是如果我手动强制它,如下所示:

<IfModule mod_expires.c>
  <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4|css|js|php)$">
    ExpiresActive On
    Header set Expires "Thu, 18 Jan 2012 20:00:00 GMT"
  </FilesMatch>
</IfModule>
它起作用了。这意味着两件事:

如果模块mod_expires.c为true,则安装mod_expire 应用此规则后,不会修改Expire标头。 我错过了什么


顺便说一句:如果你有什么办法让它发挥作用,我就是你的人

这一个也让我感到困惑,因为好吧,它应该可以工作,所以我在一个测试虚拟机上尝试了它,改变了N天的时间并刷新了它。对我来说很好。我的Apache版本是

Server version: Apache/2.2.14 (Ubuntu)
Server built:   Nov 18 2010 21:17:19
使用N=15的chrome developer工具的测试文件的任何标题显示:

Date:Mon, 09 Jan 2012 01:48:43 GMT
ETag:"7574-5-4b60e88a820a1"
Expires:Tue, 24 Jan 2012 01:48:43 GMT
我的想法是,任何ExpiresDefault都可以被标题集Expires覆盖。您是否已灰色化.htaccess层次结构以确保您的ExpiresDefault未在较低级别被覆盖


如果您不想让htaccess文件执行此操作,则需要在您的http配置中禁用它们。

好的,我从官方文档中获得:

请注意,如果使用基于修改日期的设置,则将过期 头不会添加到不是来自上的文件的内容中 磁盘这是因为没有修改时间 这样的内容


因此,它只适用于静态文件,而不适用于所有其他文件:它们不是静态的。

我没有htaccess文件高性能规则,所有内容都在vhost中,vhost中也没有类似的指令。它们是全球性的。它们应用于vhost,因为正如我在问题中强调的那样,第二个示例是有效的,它更改了过期时间。@Olivier,很抱歉,我错过了你对vhost的强调,但我的观点仍然是,你必须显式禁用.htaccess文件,以防你的应用程序目录中存在一个文件,因为任何{ExpiresDefault}这里将覆盖你的。同样,您也对Apache配置层次结构进行了灰色化,以确保其他一些{ExpiresDefault}不会按照[Configuration sections Preference]覆盖您的配置层次结构。好吧,这不是Apache的bug,所以符合您提供的证据的下一个最可能的解释是优先级问题。或者正如您指出的,它们是动态的。抱歉-我认为它们是静态的,因为您使用的是ExpiresDefault。如果它们是动态的,那么生成脚本应该主动控制缓存并发出正确的头,例如Date、Expires和process(如果修改),以及Etag请求头,如果没有更新,则发出304响应