2012-02-28 61 views
4

我在htaccess的這些指令:爲什麼瀏覽器要求緩存文件?

# BEGIN Compress text files 
<ifModule mod_deflate.c> 
    <filesMatch "\.(css|js|x?html?|php)$"> 
    SetOutputFilter DEFLATE 
    </filesMatch> 
</ifModule> 
# END Compress text files 

# BEGIN Expire headers 
<ifModule mod_expires.c> 
    ExpiresActive On 
    ExpiresDefault "access plus 1 seconds" 
    ExpiresByType image/x-icon "access plus 86400 seconds" 
    ExpiresByType image/jpeg "access plus 86400 seconds" 
    ExpiresByType image/png "access plus 86400 seconds" 
    ExpiresByType image/gif "access plus 86400 seconds" 
    ExpiresByType application/x-shockwave-flash "access plus 86400 seconds" 
    ExpiresByType text/css "access plus 86400 seconds" 
    ExpiresByType text/javascript "access plus 86400 seconds" 
    ExpiresByType application/javascript "access plus 86400 seconds" 
    ExpiresByType application/x-javascript "access plus 86400 seconds" 
    ExpiresByType text/html "access plus 600 seconds" 
    ExpiresByType application/xhtml+xml "access plus 600 seconds" 
</ifModule> 
# END Expire headers 

# BEGIN Cache-Control Headers 
<ifModule mod_headers.c> 
    <filesMatch "\.(ico|jpe?g|png|gif|swf)$"> 
    Header set Cache-Control "max-age=86400, public" 
    </filesMatch> 
    <filesMatch "\.(css)$"> 
    Header set Cache-Control "max-age=86400, public" 
    </filesMatch> 
    <filesMatch "\.(js)$"> 
    Header set Cache-Control "max-age=86400, private" 
    </filesMatch> 
    <filesMatch "\.(x?html?|php)$"> 
    Header set Cache-Control "max-age=600, private, must-revalidate" 
    </filesMatch> 
</ifModule> 
# END Cache-Control Headers 

# BEGIN Turn ETags Off 
<ifModule mod_headers.c> 
    Header unset ETag 
</ifModule> 
FileETag None 
# END Turn ETags Off 

# BEGIN Remove Last-Modified Header 
<ifModule mod_headers.c> 
    Header unset Last-Modified 
</ifModule> 
# END Remove Last-Modified Header 

(從here拍攝)

我使用Chrome瀏覽器測試,我已經注意到,應緩存的CSS文件,真不被高速緩存:

enter image description here

爲一個隨機CSS文件的請求頭是:

Accept:text/css,*/*;q=0.1 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:es-ES,es;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
Cookie:sua_language=en; keep=0; user=0; PHPSESSID=hn5gt5nb1j4sfq1j6m40un3it6; language=es 
Host:podo.com 
If-Modified-Since:Tue, 01 Nov 2011 17:20:59 GMT 
Referer:http://podo.com/sheet?id=48 
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30 

和反應是:

Cache-Control:max-age=86400, public 
Connection:Keep-Alive 
Date:Tue, 28 Feb 2012 17:50:04 GMT 
Expires:Wed, 29 Feb 2012 17:50:04 GMT 
Keep-Alive:timeout=5, max=99 
Server:Apache/2.2.15 (Unix) DAV/2 PHP/5.2.10 
Vary:Accept-Encoding 

我也有被任何JS文件之前執行以下步驟的代碼:

// Set document header 
header('Content-Type: text/javascript; charset=UTF-8'); 

$expires = ONE_DAY; 
header("Pragma: public"); 
header("Cache-Control: maxage=".$expires); 
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT'); 

,我已經注意到,如果我評論這些行並重新加載頁面(而不是通過按F5鍵,使用導航按鈕),一些(不是全部)Javascript文件具有與CSS文件相同的行爲(強制重新加載)。

發生了什麼事?爲什麼CSS文件從不緩存?爲什麼JS文件有時被緩存,有時不是?

更新:我發現,如果我評論的線< ifModule mod_expires.c >和它相應的結束標記,一切正常,這是,CSS文件不要求(與JS文件的情況) 。現在的問題是:爲什麼?

UPDATE 2:當一個CSS文件接收第一時刻(200響應)響應標頭:

Accept-Ranges:bytes 
Cache-Control:max-age=86400, public 
Connection:Keep-Alive 
Content-Encoding:gzip 
Content-Length:1633 
Content-Type:text/css 
Date:Thu, 01 Mar 2012 16:01:53 GMT 
Expires:Fri, 02 Mar 2012 16:01:53 GMT 
Keep-Alive:timeout=5, max=99 
Server:Apache/2.2.15 (Unix) DAV/2 PHP/5.2.10 
Vary:Accept-Encoding 

請求頭是相同的。

回答

3

實際上它們的都是緩存的。這裏要注意的重要一點是此行的要求:

If-Modified-Since: Tue, 01 Nov 2011 17:20:59 GMT 

鉻是要求服務器當且僅當以來,它一直Tue, 01 Nov 2011 17:20:59 GMT修改發送文件的新副本。

這裏預期的響應將是以下兩件事之一:如果文件已被修改,則服務器應在響應正文中返回新版本,其響應代碼爲200 OK。如果文件沒有被修改,服務器應該給出一個304 Not Modified響應,響應的主體將是空的 - 如果你看看控制檯中顯示的響應代碼,你會發現這是發生了什麼。

欲瞭解更多信息,請參閱RFC2616的this sectionthis section

腳註:有趣的是,我以前沒有發現,我不能輕易解釋就是爲什麼private資源與複覈的服務器使用,並且public資源都沒有。至少,這是我假設正在發生的事實,您的JS文件直接從緩存中使用,而您的CSS文件不是。 「

+0

」響應的主體將是空的「。我不知道您是否在引用「內容」標籤上顯示的Chrome。這裏顯示了文件的全部內容。但它也顯示了*(從緩存)*文件相同。這一點是爲什麼一些文件「重新檢查」和其他文件沒有?我的意圖是避免任何複覈。 此外,我試圖改變「公共」和「私人」類型沒有任何改變。 – Ivan 2012-02-28 18:51:00

+0

我打算明天去玩一下,看看我能否拿出一個明確的答案。我認爲這可能與'private' /'public'指令有關,請嘗試清除瀏覽器緩存並將CSS/JS設置爲'private',以查看是否擺脫了其他請求。 – DaveRandom 2012-02-29 00:57:12

+0

我已經測試過所有組合沒有成功,沒有變化。你見過我的更新嗎? – Ivan 2012-02-29 09:37:29