Локальный стек 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>
Другие вопросы по тегам