Столкнулся с кэшированием и узнал, что запрет кэширования методом в Wikipedia не работает. Вот этот метод:
1 2 3 4 5 6 7 8 9 10 |
<?php /* ** Проверка работоспособности кода запрета кэширования */ header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate( "D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); echo "<h1>", date("H:i:s"), "</h1>"; ?> |
А теперь о том, что протестировано и то, что работает.
Запретить кэширование на PHP:
1 2 3 4 5 6 7 8 |
<?php /* ** Правильный запрет кэширования на PHP */ header("Cache-Control: no-store, no-cache, must-revalidate"); header("Expires: " . date("r")); echo "<h1>", date("H:i:s"), "</h1>"; ?> |
Чтобы не приписывать каждой странице эти сточки на PHP, можно сделать это на уровне конфигурации Apache, для этого нужно:
1) Зайти в конфиг Апача и убедиться, что следующие модули включены. Если они закомментированы, то раскомментируйте их:
1 2 3 4 5 |
LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so ... AddModule mod_expires.c AddModule mod_headers.c |
2) В файле .htaccess вписать строки, запрещающие кэширование:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Запрещение кеширования # Необходимо включение модулей # mod_headers.c и mod_expires.c # Заголовок Cache-Control <IfModule mod_headers.c> Header append Cache-Control "no-store, no-cache, must-revalidate" </IfModule> # Заголовок Expires <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "now" </IfModule> |
Но полный запрет кэширования повышает нагрузку на сервер и замедляет загрузку контента на стороне пользователя. Поэтому, предложенный ниже способ разрешает кэширование только на один час. Т.е. обновляться кэш на стороне пользователя будет раз в час, при этом Вы сэкономите ресурсы своего сервера.
Разрешаем кэширование на 1 час при помощи PHP:
1 2 3 4 5 6 7 8 |
<?php /* ** Включение кэширования на 1 час */ header("Cache-Control: public"); header("Expires: " . date("r", time() + 3600)); echo "<h1>", date("H:i:s"), "</h1>"; ?> |
Или разрашем кэширование на 1 час при помощи конфига Апача.
1) Убеждаемся, что нужные модули mod_headers.c и mod_expires.c включены (как было описано выше).
2) В нужной папке создаем файл .htaccess и прописываем следующие строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Разрешение кеширования # Необходимо включение модулей # mod_headers.c и mod_expires.c # Заголовок Cache-Control <IfModule mod_headers.c> Header append Cache-Control "public" </IfModule> # Заголовок Expires <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 hours" </IfModule> |