rizloff
Веб

Кеширование картинок и стилей через .htaccess: mod_expires

2 мин чтения

Год назад я включал сжатие через mod_deflate. Второй шаг, чтобы сайт открывался быстрее: сказать браузеру, что картинки, стили и скрипты можно не качать заново при каждом заходе. Для этого в Apache есть mod_expires.

Правила

В .htaccess в корне сайта:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
</IfModule>

Картинки браузер хранит месяц, стили и скрипты неделю. HTML-страницы сюда не пишем: их кешировать нельзя, иначе читатели не увидят новые записи и комментарии.

Подвох со стилями

Поправил стили, а у постоянных читателей сайт неделю выглядит по-старому: браузер не спрашивает сервер, у него есть копия. Лечится добавкой к адресу файла. В шаблоне вместо style.css пишем style.css?v=2 и при каждой правке меняем число. Для браузера это новый адрес, и он скачает файл заново.

WordPress для стилей и скриптов, подключенных через wp_enqueue_style и wp_enqueue_script, сам дописывает номер версии.

Проверка

curl -I http://example.com/wp-content/themes/моя_тема/style.css

В ответе должны быть заголовки Expires и Cache-Control: max-age=.... Нет их, значит модуль на хостинге не включен, и пишем в поддержку, как и с mod_deflate.

На блоге при повторном заходе страница грузится заметно быстрее: из сети приходит только сам HTML.

Что-то не сработало или нашли ошибку — напишите: rizloff@gmail.com или @rizloff в Telegram.