


Кэширование на клиентском уровне. Автоматизация кэширования. Уменьшение количества запросов
Условное кэширование
Сброс кэша
Кэширование на серверном уровне
Кэширование XHR-запросов Настройка кэширования для предотвращения дополнительных запросов из браузера к
серверу осуществляется достаточно просто: нужно всего лишь знать наиболее
характерные случаи использования:
Статические ресурсы без сжатия
Форсирование кэширования для статических ресурсов без сжатия. В данном случае мы
ничем не рискуем, выставляя не только максимальное время кэширования, но и предлагая
кэшировать ресурсы на локальных прокси-серверах (директива Cache-Control: public).
Для PHP у нас получится следующий код (в Expires прописана дата на 10 лет вперед
относительно текущего времени на сервере):
header("Cache-Control: public, max-age=315360000");
header("Expires: Mon, 01 Jul 2019 00:00:00");
?>
В случае выставления директив для Apache:
Header append Cache-Control public
ExpiresActive On
ExpiresDefault "access plus 10 years"
И в случае nginx:
location ~* ^.+\.(bmp|gif|jpg|jpeg|png|swf|tiff|swf|flv)$ {
expires 10y;
header set Cache-Control public;
}
10-летний срок кэширования здесь вполне оправдан: таким образом мы сообщаем
пользователям, что ресурсы в течение этого времени перезапрашивать не нужно. Если
ресурсы будут изменены, то нам все равно придется форсировать сброс кэша (об этом
чуть ниже), чтобы гарантировать корректное отображение материалов сайта во всех
браузерах.
Статические ресурсы со сжатием
Все отличие от предыдущего случая заключается в том, что разрешить локальным прокси-
серверам кэшировать такие ресурсы (обычно это CSS-, JavaScript- или ICO-файлы) нельзя.
Даже больше: нам нужно запретить кэширование сжатых версий файлов, чтобы избежать
выдачи сжатого файла тем пользователям, которые сжатия не поддерживают.
Код для PHP:
header("Cache-Control: private, max-age=315360000");
header("Expires: Mon, 01 Jul 2019 00:00:00");
?>
Для Apache:
Header append Cache-Control private
ExpiresActive On
ExpiresDefault "access plus 10 years"
И для nginx:
location ~* ^.+\.(css|js|ico)$ {
expires 10y;
header set Cache-Control private;
}
Очевидно, что в некоторых случаях директивы можно объединить с предыдущим
случаем.
Если нам нужно добавить кэширование на определенный срок для HTML-документов, то
достаточно прописать в директиве FilesMatch расширения файлов, указанные чуть ниже.
Запрет кэширования динамических ресурсов
Обычно для произвольного сайта (информация на котором часто меняется) кэширование
HTML-документов запрещено. Это связано с быстрым устареванием предоставляемой
информации (здесь стоит отметить, что правила для отображения и взаимодействия
информации ? стили и скрипты ? устаревают намного медленнее, чем сам информация).
Для того чтобы запретить кэширование во всех браузерах HTML-документов, нужно
написать с помощью PHP (в Expires прописано текущее время на сервере):
header("Expires: Wed, 01 July 2009 00:00:00");
header("Cache-Control: no-store, no-cache, must-revalidate, private");
header("Pragma: no-cache");
Для Apache:
ExpiresActive Off
Header append Cache-Control "no-store, no-cache, must-revalidate, private"
Header append Pragma "no-cache"
Для nginx:
location ~* ^.+\.(php|phtml|shtml|html|xml|htm)$ {
expires 0;
header set Cache-Control "no-store, no-cache, must-revalidate, private";
header set Pragma ?no-cache ;
}