2012-02-28 11 views
4

私は私のhtaccessのでこれらのディレクティブを持っている:私はテストするためにChromeを使用していると私は本当に、キャッシュされるべきCSSファイル気づいたなぜブラウザはキャッシュファイルを要求していますか?

# 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から取られた)

キャッシュされていません。

enter image description here

を1つのランダム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ファイルがキャッシュされることがありますか、ときどきキャッシュされないのですか?

UPDATE:私はライン<のIfModule mod_expires.c >をコメントし、それが終了タグを対応するならばすべてが期待どおりに動作します(JSファイルで起こるように)、それは、CSSファイルが要求されていないことを発見しました。問題は今です:なぜですか?

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 

Chromeは、それがTue, 01 Nov 2011 17:20:59 GMT以降に変更されている唯一の場合ならば、ファイルの新しいコピーを送信するためにサーバーを求めています。

ここで期待される応答は、次の2つのうちのいずれかになります。ファイルが変更されている場合、サーバーは応答コード200 OK応答コードで新しいバージョンを返す必要があります。ファイルが変更されていない場合、サーバーは304 Not Modified応答を返す必要があり、応答本体は空になります。コンソールに表示された応答コードを見ると、これが起こっていることがわかります。

詳細については、RFC2616のthis sectionおよびthis sectionを参照してください。

脚注:何面白いです、私は以前に観察していないと私は容易に説明することはできませんがprivateリソースは、サーバーを再チェックで使用されている理由である、とpublicリソースがありません。少なくとも、これはあなたのJSファイルがキャッシュから直接使用され、CSSファイルは使用されないという事実に基づいて起こっていると私が想定しているものです。

+0

"レスポンスの本文は空になります"。 Chromeが[コンテンツ]タブに表示する内容を参照しているかどうかはわかりません。ここには、ファイルの完全な内容が表示されます。しかし、それは*(キャッシュから)*ファイルについても同じことを示しています。ポイントはいくつかのファイルが "再チェック"され、他のファイルはなぜですか?私の意図は再検査を避けることでした。 また、私は "public"と "private"の型を変更せずに変更しようとしました。 – Ivan

+0

私はこの明日にいくつか遊んで、決定的な答えを出すことができるかどうかを見ていきます。私はそれが 'private' /' public'ディレクティブに関連する可能性が高いと思います。あなたのブラウザのキャッシュをクリアし、CSS/JSを両方とも 'private'に設定して、 – DaveRandom

+0

私は成功裏にすべての組み合わせをテストしましたが、変更はありません。私の更新を見たことがありますか? – Ivan

関連する問題