Поиск по сайту:

Как настроить заголовки Cache-Control в Apache


Браузер каждого пользователя использует встроенный кеш для хранения загруженных объектов, что может значительно ускорить повторные посещения вашего веб-сайта за счет загрузки с диска, а не из сети. Вот как настроить его в Apache.

Как работает кэширование?

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

Это кэш на стороне клиента, но многие сайты также используют сеть доставки контента или CDN. CDN — это сеть серверов, расположенных перед вашим основным веб-сервером или «исходным» сервером. Эта сеть кэширует ваши страницы, увеличивая максимальную пропускную способность, уменьшая задержку доступа и значительно снижая нагрузку на исходный сервер. Если вы хотите узнать больше о CDN, вы можете прочитать наше руководство по ним здесь.

Cache-Control – это заголовок, который вы можете настроить на своем веб-сервере для добавления ко всем исходящим запросам, который будет указывать браузеру и CDN, как кэшировать ваш контент.

Некоторые страницы никогда не должны кэшироваться общими кэшами, такими как CDN. Это может привести к тому, что личная информация одного пользователя будет показана другим. Как правило, если страница будет одинаковой для всех пользователей, например, ваша домашняя страница, вы можете кэшировать ее. Если он показывает конфиденциальную информацию о пользователе, вы захотите внести ее в черный список из своего кеша. Статические ресурсы, такие как CSS и изображения, обычно можно кэшировать для всех, часто на гораздо более длительный срок.

Количество времени, которое объект проводит в кеше, также важно. Называемый временем жизни (TTL), максимальный возраст ваших кэшированных ресурсов определяет, как долго объект будет оставаться в кэше, прежде чем он будет признан недействительным, и предложит пользователю запросить новый объект. Для статических ресурсов, которые не сильно меняются, вы можете установить очень высокие значения TTL, обычно около двух лет. Для вещей, которые вы, возможно, захотите обновить, вам нужно установить более низкие значения TTL, чтобы устаревшие ресурсы не находились в кеше слишком долго.

Вы всегда можете использовать версионные имена файлов для запуска перезагрузки кеша. Если вы выпускаете новую версию таблицы стилей CSS, вы можете назвать ее styles-1.0.1.css, и браузер пользователя (и любые CDN перед ней) увидит ее как новую файл, который необходимо перезагрузить. Кроме того, для некоторых CDN вы можете выполнить аннулирование вручную, чтобы очистить существующий кеш без изменения имен файлов.

Как использовать Cache-Control в Apache

Cache-Control имеет несколько параметров:

  • public  — может кэшироваться кем угодно, включая браузеры и CDN. Используйте это для большинства статических объектов.
  • private  – содержит конфиденциальные данные, которые не могут быть кэшированы CDN или обратными прокси-серверами. Браузер пользователя может кэшировать его локально. Используйте это для большинства аутентифицированных страниц.
  • no-cache  — несмотря на название, кэширование не отключается. Браузер может по-прежнему кэшировать ответ для повышения производительности, но перед его использованием он должен проверить наличие обновлений на исходном сервере. Используйте это, если хотите, чтобы пользователь каждый раз проходил повторную проверку.
  • no-store  – полностью отключает кеширование. Используйте это только для особо конфиденциальных данных, которые не следует отправлять дважды.

Кроме того, вы можете добавить директиву no-transform , которая отключает любые преобразования, которые могут быть выполнены с ресурсом. Например, некоторые CDN сжимают изображения для уменьшения пропускной способности. Эта директива отключает такое поведение.

В Apache вам придется установить этот заголовок вручную с помощью директивы Header set, например:

Header set Cache-Control "max-age=84600, public"

Значение max-age задается в секундах, например max-age=300 для пятиминутного срока жизни и max-age=63072000  на два года.

Вы можете поместить эту директиву в корень своей конфигурации, чтобы применить ее ко всему сайту, но лучший способ — применить настройки в зависимости от типа файла. Например, чтобы установить высокий TTL для большинства статических носителей, вы можете использовать блок FilesMatch:

<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
  Header set Cache-Control "max-age=63072000, public"
</FilesMatch>

Если вы хотите внести определенный путь в черный список из кэша CDN, вы можете использовать блок Directory:

<Directory "/private">
 Header set Cache-Control "max-age=300, private"
</Directory>

Или просто сопоставьте один файл:

<File "protected.html">
Header set Cache-Control "max-age=300, private"
</File>

Блоки с более конкретными совпадениями будут иметь приоритет над общими совпадениями с регулярными выражениями, но вы должны убедиться, что на принимающей стороне все настроено правильно. Вы можете проверить это в Chrome DevTools в разделе Сеть > Заголовки.

Если у вас есть доступ только к конфигурации .htaccess, вы все равно можете использовать сопоставление каталогов, создав новый файл .htaccess в каждом подкаталоге.

Используйте Surrogate-Control для прямого изменения поведения CDN

Заголовок Surrogate-Control работает точно так же, как Cache-Control, но содержит конкретные инструкции для CDN и обратных прокси-серверов, а не для конечных пользователей. Таким образом, вы можете указать CDN делать одно, но отправлять браузеру разные указания.

Вам придется установить этот заголовок вручную, так же, как вы устанавливаете Cache-Control:

Header set Surrogate-Control "max-age=300, public"

Вы определенно захотите протестировать свою CDN, чтобы убедиться, что это работает — Surrogate-Control довольно новый и не универсальный.