2012-01-11 85 views
3

如果我這樣做:Apache:ExpiresDefault不起作用,而「標題」起作用。怎麼會?

<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> 

它不正確設置過期頭,而如果我「逼」它的手像這樣:

<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_expire(IfModule mod_expires.c爲true)
  • 的到期報頭是不應用此規則之後改性。

我錯過了什麼?順便說一下:如果你有任何解決方案使它工作,我是你的男人!

回答

4

好,我從官方文檔here得到它:

請注意,如果您使用修改日期根據設置,過期 頭不會被添加到內容並非來自一個文件在 磁盤上。這是由於 這樣的內容沒有修改時間。

因此,它只適用於靜態文件,而不適用於所有其他文件:它們不是靜態文件。

0

這一個讓我難住,因爲AFAIK,它應該工作,所以我試了它在一個測試虛擬機,改變N天和刷新。對我來說工作得很好。我的Apache的版本是

Server version: Apache/2.2.14 (Ubuntu) 
Server built: Nov 18 2010 21:17:19 

任何一個測試文件頭(使用Chrome開發者工具)(與N = 15)顯示:

Date:Mon, 09 Jan 2012 01:48:43 GMT 
ETag:"7574-5-4b60e88a820a1" 
Expires:Tue, 24 Jan 2012 01:48:43 GMT 

我的想法是,任何ExpiresDefault可以通過覆蓋Header set Expires。你有沒有grepped .htaccess層次結構,以確保你的ExpiresDefault沒有被覆蓋在較低的水平。

如果你不想讓htaccess文件做到這一點,你需要在你的http配置中禁用它們。

+0

我沒有htaccess文件(高性能規則),一切都在虛擬主機中,並且在虛擬主機中沒有像這樣的指令。他們是全球性的。它們適用於虛擬主機,因爲正如我在我的問題中強調的那樣,第二個例子起作用,並且它改變了過期。 – 2012-01-11 21:01:37

+0

所以我肯定被卡住了...... – 2012-01-11 21:22:04

+0

@Olivier,抱歉,我錯過了你對vhost的強調,但是我的觀點仍然認爲你明確地禁用了.htaccess文件,以防萬一你的應用程序目錄/目錄中存在一個文件,因爲任何{ ExpiresDefault}在這裏將覆蓋你的。同上你有沒有grep的Apache配置層次結構,以確保其他{ExpiresDefault}不會覆蓋你的配置節優先級(http://httpd.apache.org/docs/2.2/sections.html)。 AFAIK,這不是一個Apache的錯誤,所以下一個最可能的解釋是符合你提供的證據是一個優先問題。 – TerryE 2012-01-12 23:57:07