После прочтения многих статей и некоторых вопросов здесь я, наконец, успешно активировал Apache mod_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 > Net > Images), я вижу различные типы кэширования (я, очевидно, начал с кэша браузера, который был полностью пуст, я заставил кеш удалить в браузере с помощью "Очистить всю историю" ):
-
Когда страница загружается в первый раз, все изображения загружаются (и то же самое происходит, если я принудительно перезагружаю страницу, нажимая кнопку страницы перезагрузки браузера). Это имеет смысл!
-
Когда я перемещаюсь по сайту и возвращаюсь на ту же страницу, изображения вообще не загружаются, а браузер НЕ запрашивает сервер для любого изображений. Это имеет смысл (и я хотел бы видеть это поведение также, когда браузер закрыт)!
-
Когда я закрою браузер и снова открою его на той же странице, глупый браузер делает любой HTTP-запрос на сервер один раз на изображение: он НЕ уменьшает изображение, но он все же делает HTTP-запрос, он, как браузер, запрашивает сервер об изображении (сервер отвечает на 200 OK). Это раздражает меня!
Я также приложил графики ниже, если вы заинтересованы:
EDIT: просто протестируйте теперь также FireFox 11.0, чтобы убедиться, что это не проблема моего FireFox 3.6, слишком старая. То же самое происходит!!! Я также тестировал сайт Google и сайт Stackoverflow, они оба отправляют Cache-Control: max-age=...
, но браузер по-прежнему делает HTTP-запрос на сервер для каждого изображения после закрытия и открытия браузера снова на той же странице, после ответа сервера браузер НЕ загружает изображение (как я объяснял выше), но он по-прежнему делает проклятый запрос, который увеличивает время просмотра страницы.
EDIT2: и удаление заголовка Last-Modified
, как предложено здесь, не решает проблему, это не имеет никакого значения.