Локальный стек LAMP, предотвращение кеширования PHP динамически загружаемых страниц
У меня есть локальный стек LAMP, работающий на Linux. У меня есть обычный Apache/PHP/mySQL, и все отлично работает с localhost.
У меня есть небольшое приложение на сервере, которое отображает древовидное представление. Здесь перечислены серии документов, которые находятся локально (на сервере). Эти файлы можно просмотреть, щелкнув их в дереве, после чего они загружаются в DIV на странице. Эти файлы могут быть отредактированы с помощью простого редактора, который я написал в приложении. Это работает отлично до сих пор.
Проблема в том, что PHP (я полагаю) кэширует эти документы по мере их загрузки, а это означает, что когда пользователь редактирует их, хотя они сохраняются, когда они повторно выбираются в дереве, отображается кэшированная версия, а не новая отредактированная версия.
Начальная страница приложения была стандартной HTML-страницей, но я переименовал ее в PHP и добавил следующий код в начало этой страницы:
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>
К сожалению, хотя это, по-видимому, препятствует кэшированию главной страницы, это не мешает тем файлам, которые загружаются динамически во время общего использования приложения.
Можно ли как-то предотвратить PHP (все еще предполагая, что это PHP) кэшировать эти динамически загруженные локальные файлы?
1 ответ
Вы смешиваете кэш кода операции и кеш браузера. Заголовки, которые вы устанавливаете, не имеют ничего общего с PHP, это заголовки http, которые влияют на кэширование браузера. PHP будет (если он настроен правильно с APC или подобным) кэшировать код операции, который не имеет никакого отношения к вашей проблеме.
Вы должны установить заголовки кэширования в файле при загрузке их на клиент для редактирования, чтобы клиент (браузер) не мог их кэшировать.
Каждая загрузка (файл css, файл js, любой файл) является отдельным запросом http и поэтому имеет свой собственный набор заголовков. Поэтому, если вы устанавливаете пользовательские заголовки для каждого запроса, вам придется устанавливать их для каждого такого запроса. В вашем случае более простым решением было бы добавить эти заголовки на уровне конфигурации Apache.
Апач Header
Директива проста в использовании, и вы можете использовать ее практически в любом месте цепочки конфигурации Apache. Это означает.htacess, vhost config или общую конфигурацию apache. Как решать это вам, зависит от вас и вашей серверной среды.
Пример того, как вы можете добавить заголовок в ваш.htaccess:
Header set Cache-control "max-age=0, no-store"
Или, если вы хотите установить определенные заголовки только для определенных типов файлов:
<FilesMatch "\.(gif)$" >
Header set Cache-control "max-age=0, no-store"
</FilesMatch>