Не всегда и не для всех сайтов полезно кэширование всех или отдельных страниц. Некоторым это может показаться странным, ведь кэширование снижает нагрузку на сервер, особенно при большой активности и посещаемости посетителей, но только не тем, у кого на страницах сайтов или веб-сервисов слишком часто обновляется контент, а посетители при этом должны всегда получать самую свежую и актуальную информацию при каждой загрузке страниц. К таким веб-ресурсам можно отнести веб-чаты, голосования, игры, новости, счетчики и тому подобные. В этой статье будут представлены методы для запрета кэширования страниц сайта.
Речь здесь не о том, как запретить кэш лишь в браузере, а о том, как запретить кэширование контента на стороне сервера. Многим наверно известны методы запрета кэширования в заголовках HTML-страниц, например упомянутые в Wikipedia, такие как
Кроме того можно использовать и такие
В первой строке указывается рекомендация запрещать кэширование вообще, а вторая строка указывает браузеру, что страница используется в приватном режиме, поэтому ее содержимое не должно кэшироваться. Мета-теги в третьей и четвертой строках указывают на то, что срок хранения в кэше ограничено временем max-age=10800
(что равно 3-м часам) для браузера и для прокси соответственно.
Приведенные выше в пример рекомендации хороши однако лишь для тех владельцев сайтов, у которых нет доступа к PHP-скриптам, и больше подходят для нединамических страниц. Это, как говорится, «последний шанс», и лишь потому, что многие браузеры, да к тому же их многочисленные версии, все меньше и меньше обращают внимание на то, что прописано в HEAD-секциях страниц сайтов. Каждый из них «тянет одеяло на себя» и не все и не всегда придерживаются каких-то стандартов. Другими словами то, что было сказано выше, может не сработать.
Запрет кэширования страниц на PHP
Альтернатива этому — запретить кэширование страниц сайта с использованием PHP-скриптов, а именно при помощи функции header(...);
, которая позволяет добавлять в заголовки пакетов HTTP необходимые параметры и директивы. На данный момент последние версии популярных браузеров и соответственно серверы более-менее одинаково обрабатывают эти заголовки HTTP-пакетов. В связи с этим более надежным и гибкими способом запрета кэширования будет применение PHP.
Вот пример простого указания сроков кэширования страниц сайта:
Однако на практике оказалось, что этого может быть недостаточно, и после многочисленных экспериментов с разными браузерами наиболее лучшим вариантом запрета кэширования на PHP будет такой подход:
В некоторых случаях может пригодиться в параметре заголовка использовать дополнительные параметры post-check=0
и pre-check=0
... Header( 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' ); ...
Некоторые добиваются запрета кэширования страниц или изображений методом добавления к ссылкам рандомного (случайного) числа, как параметра запроса. Точнее это не запрет, а попытка обмануть браузер, что мол он должен заново загрузить страницу, так как URL уже изменен:
$echo = ' Ссылка '; $echo = '';
Правда это не всегда и не на всех версиях и типах браузеров срабатывает, да и может помочь лишь в случаях, когда ссылки генерируются динамически.
Проверка, что кэширование отключено
Проверить, кэшируется ли страница или нет, можно с помощью добавления времени сервера, в которое была сгенерирована конкретная страница, непосредственно в код страницы. Это легко сделать с помощью PHP
Время создания страницы: ' . date("H:i:s") . ''; ?>
В строке №6 содержится код date("H:i:s")
, который показывает точное серверное время, в которое страница была создана. Таким образом, при каждом запросе к странице, при условии, что кэширование полностью отключено, мы всегда будем видеть абсолютно новое время. Если все же кэширование выполняется, то при частых запросах страница будет содержать одно и то же время.
Запрет кэширования страниц средствами Apache .htaccess
Недавно у меня был случай, произошло так, что на одном из порталов внезапно перестал работать веб-чат. Вернее он работал, ошибок никаких абсолютно не было, но пользователи видели в нем лишь свои сообщения, но не видели сообщений своих собеседников. В попытке исправить ситуацию, я выяснил, что на хостинге обновили серверную конфигурацию Apache вместе с кэширующим прокси Nginx. Затем попытался использовать практически все перечисленные выше методы для отключения кэша, но ничего не помогло. Самой последней надеждой и попыткой было решено прибегнуть к помощи Apache, попробовать использовать файл .htaccess.
Добавив в файл .htaccess, который находился в каталоге скриптов веб-чата, следующие установки, я решил проблему:
Header append Cache-Control "no-store, no-cache, must-revalidate" ExpiresActive On ExpiresDefault "now"
Так что тем, для кого проблема запрета кэширования страниц сайта является актуальной, то рекомендую использовать метод средствами файлов .htaccess
сервера Apache. Правда это будет тоже работать лишь при условии, что на вашем хостинге будут загружены и подключены соответствующие модули — mod_expires.so
и mod_headers.so
. Подключены они или нет, можно будет убедиться при просмотре конфигурационного файла Apache, панели управления на хостинге или, в крайнем случае, обратившись с вопросом к тех.поддержке хостинга.
LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so
AddModule mod_expires.c AddModule mod_headers.c
Если же эти модули у вас подключены, то вы можете манипулировать и кэшированием отдельных файлов, например добавив в .htaccess такие директивы:
ExpiresActive On ExpiresDefault "now" Header append Cache-Control must-revalidate ExpiresDefault "now"
Кроме того, Вы сможете указывать время ограничения кэширования, например:
ExpiresDefault "access plus 1 month" # или # ExpiresDefault "access plus 4 weeks" # или # ExpiresDefault "access plus 30 days"
Эти варианты директив имеют одинаковый смысл и значение, и будут ограничивать кэширование сроком на 1 месяц. Еще можно будет указывать типы файлов контента со сроком окончания времени кэширования или указанием времени их модификации:
ExpiresByType text/html "access plus 1 month 7 days 12 hours" ExpiresByType image/gif "modification plus 3 hours 15 minutes"
На этом пожалуй пока все. Надеюсь информация будет для Вас полезной. Если же у Вас есть свои наработки, дополнения, то не стесняйтесь, пишите их в комментариях или шлите мне по почте, а я добавлю (после проверки) в эту статью.
Метки: apache, htaccess, PHP, кэширование