Кэширование изображений сайта с помощью Apache - PullRequest
41 голосов
/ 15 января 2009

Как я могу получить статический контент на Apache, который {кэшируется браузером}, а не {проверяется на свежесть {с каждым запросом}}?

Я работаю над сайтом, размещенным на веб-сервере Apache. Недавно я что-то тестировал с заголовками (Content-Type для разных типов контента) и видел много условных запросов на изображения. Пример:

200 /index.php?page=1234&action=list
304 /favicon.ico
304 /img/logo.png
304 /img/arrow.png
(etc.)

Хотя файлы изображений являются статическим содержимым и кэшируются браузером, каждый раз, когда пользователь открывает страницу, которая ссылается на него, он запрашивается по условию, на который он отправляет «304 Не изменено». Это хорошо (меньше передаваемых данных), но это означает, что при каждой загрузке страницы увеличивается на 20 и более запросов (более длительная загрузка страницы из-за всех этих циклов обработки, даже с поддержкой Keep-Alive и конвейерной передачей).

Как мне сказать браузеру сохранить существующий файл и не проверять его на более новую версию?

EDIT: метод mod_expires работает даже со значком.

Ответы [ 4 ]

54 голосов
/ 15 января 2009

Срок действия истекает Модуль в Apache решает эту проблему - его необходимо загрузить в конфигурации сервера и настроить в .htaccess (или в конфигурации сервера).

С заголовком Expires ресурс запрашивается только в первый раз. До истечения срока действия последующие запросы выполняются из кэша браузера. По истечении заданного времени и необходимости в ресурсе, только затем он запрашивается снова (условно - возвращается 304 для неизмененного ресурса). Единственный надежный способ удалить его из кэша до его истечения - это вручную или принудительно обновить его (обычно Ctrl-F5). (Это может быть проблемой, если ресурс тем временем меняется, но статические изображения меняются не очень часто.)

# enable the directives - assuming they're not enabled globally
ExpiresActive on

# send an Expires: header for each of these mimetypes (as defined by server)
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"

# css may change a bit sometimes, so define shorter expiration
ExpiresByType text/css "access plus 1 days"

Для favicon.ico требуется немного больше работы (Apache обычно не распознает файлы значков Windows и отправляет его как текст по умолчанию / обычный текст).

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon
AddType image/vnd.microsoft.icon .ico
# now we have icon MIME type, we can use it
# my favicon doesn't change much
ExpiresByType image/vnd.microsoft.icon "access plus 3 months"

И вуаля, это работает ™!

25 голосов
/ 05 апреля 2012

С помощью директивы filesMatch вместо ExpiresByType вы можете сгруппировать Content-Type, сопоставив subtype (например, image/*), вместо перечисления каждой пары type/subtype, а не subtype (например, image/jpeg, image/png).

#Set caching on image files for 11 months
<filesMatch "\.(ico|gif|jpg|png)$">
  ExpiresActive On
  ExpiresDefault "access plus 11 month"
  Header append Cache-Control "public"
</filesMatch>

В соответствии с этой статьей Google Я сделал срок действия не более 1 года (access plus 11 month) и добавил Cache-Control "public", чтобы включить HTTPS-кэширование для Firefox.

Для CSS и JS Google рекомендует срок действия 1 неделя.

<filesMatch "\.(css|js)$">
  ExpiresActive On
  ExpiresDefault "access plus 1 week"
  Header append Cache-Control "public"
</filesMatch>
3 голосов
/ 15 января 2009

Если вы установите заголовок Expires в своем http-ответе для статических изображений, ваш сервер больше не будет проверяться для этого изображения после первой загрузки, пока не пройдет указанное время, например, если я сейчас скачиваю файл с вашего сервера, который выдает заголовок Expires как

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

тогда мой браузер не будет искать его с вашего сервера до 2010 года, если я не очистлю свой кэш / не выполню принудительное обновление (Ctrl + F5 на окнах).

Здесь есть простое введение в настройку здесь и список других, возможно, полезных ответов в wikipedia

2 голосов
/ 09 июля 2011

Что касается favicon.ico, поместите его в корневой каталог вашего сервера, скажем, / var / www / html и добавьте его в /etc/httpd/conf/httpd.conf в разделе псевдонимов: -

Alias /favicon.ico "/var/www/html/favicon.ico"
<Directory "/var/www/html">
    <Files favicon.ico>
       ExpiresActive On
       ExpiresDefault "access plus 1 month"
    </Files>
</Directory>

Тогда один файл favicon.ico будет работать для всех виртуальных хостинговых сайтов, поскольку вы используете его для псевдонимов. После того, как пользователь заходит на ваш сайт, любые последующие посещения будут основываться на копии кэша браузера в течение одного месяца, а не в Интернете.

Я не смог получить

ExpiresByType image/ico "access plus 1 month"

работать вообще. Может быть, это должен быть тип text / plain, как предложено выше. В любом случае ExpiresDefault работает нормально.

...