ここで多くの記事といくつかの質問を読んだ後、私はついにApachemod_expires
をアクティブ化して、ブラウザーに1年間画像をキャッシュする必要があることを通知することに成功しました。
<filesMatch "\.(ico|gif|jpg|png)$">
ExpiresActive On
ExpiresDefault "access plus 1 year"
Header append Cache-Control "public"
</filesMatch>
そしてありがたいことに、サーバーの応答は正しいようです。
HTTP/1.1 200 OK
Date: Fri, 06 Apr 2012 19:25:30 GMT
Server: Apache
Last-Modified: Tue, 26 Jul 2011 18:50:14 GMT
Accept-Ranges: bytes
Content-Length: 24884
Cache-Control: max-age=31536000, public
Expires: Sat, 06 Apr 2013 19:25:30 GMT
Connection: close
Content-Type: image/jpeg
そうですね、これでブラウザのダウンロードが停止し、サーバーに1年間画像について問い合わせることさえできると思いました。しかし、それは部分的に真実です。ブラウザを閉じて再度開くと、ブラウザはサーバーから画像をダウンロードしなくなりますが、ブラウザは各画像のHTTPリクエストでサーバーに問い合わせます。
各画像に対するHTTPリクエストの作成をブラウザに強制的に停止させるにはどうすればよいですか?これらのHTTPリクエストの後に画像がダウンロードされない場合でも、サーバーに対して行われるリクエストであるため、レイテンシが不必要に増加し、ページのレンダリングが遅くなります。
私はすでにブラウザに画像を1年間キャッシュに保持しなければならないと言いました!なぜブラウザは(画像をダウンロードしなくても)各画像についてサーバーに問い合わせるのですか?!
FireBugのネットワークグラフを見ると([FireBug]> [ネット]>[画像]メニュー)、さまざまなキャッシュ動作を確認できます(明らかに、ブラウザーキャッシュを完全に空にして開始し、[すべての履歴をクリア]を使用してブラウザーでキャッシュを強制的に削除しました)。
ページが初めて読み込まれると、すべての画像がダウンロードされます(ブラウザの[ページの再読み込み]ボタンをクリックしてページを強制的に再読み込みした場合も同じことが起こります)。意味あり!
サイトをナビゲートして同じページに戻ると、画像はまったくダウンロードされず、ブラウザはサーバーに画像を問い合わせることさえしません。これは理にかなっています(そして、ブラウザが閉じているときもこの動作を見たいです)!
ブラウザを閉じて同じページでもう一度開くと、ばかげたブラウザはとにかく画像ごとに1回サーバーにHTTPリクエストを送信します。画像をダウンロードしませんが、それでもHTTPリクエストを送信します。これは、ブラウザが問い合わせるようなものです。画像に関するサーバー(サーバーは200 OKで応答します)。これは私を苛立たせるものです!
興味があれば、以下のグラフも添付します。
編集:FireFox 3.6が古すぎるという問題ではないことを確認するために、FireFox11.0でもテストしました。同じことが起こります!!! GoogleサイトとStackoverflowサイトもテストしましたが、どちらも送信しますCache-Control: max-age=...
が、ブラウザを閉じて同じページで再度開くと、ブラウザはサーバーにHTTPリクエストを送信します。サーバーの応答後、ブラウザはダウンロードしません。画像(上で説明したように)ですが、それでもページを表示する時間が長くなるようなリクエストが発生します。
EDIT2:ここLast-Modified
で提案されているようにヘッダーを削除しても、問題は解決せず、違いはありません。