Я делаю 3 вещи, чтобы убедиться, что динамические данные не кэшируются:
- Установка соответствующих заголовков ответа;
- Включение метатегов HTML;
- Добавитьвременная метка для URL ресурсов, которые могут измениться.
1.Установите соответствующие заголовки ответа
По существу, срок действия этих наборов заголовков в прошлом устанавливает множество директив, чтобы сервисы между вашим выходом PHP и конечным клиентом не изменяли или не кэшировали ваш источник.
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Cache-Control: nocache, must-revalidate, no-store, max-age=0, private, max-stale=0, post-check=0, pre-check=0, no-transform
Pragma: no-cache
2.Включите метатеги HTML
Некоторые прокси-серверы и веб-клиент будут анализировать HTML (чего следует избегать в приведенной выше директиве «no-transform»).Поэтому добавление директив в вывод HTML еще больше снижает риск кэширования.
В этом html-фрагменте есть две спецификации «expires» - насколько я понял, некоторые веб-клиенты не будут анализировать дату.
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Sat, 26 Jul 1997 05:00:00 GMT" />
3.Добавьте временную метку к URL-адресам ресурсов, которые могут измениться.
Статические ресурсы (или эквивалентные), такие как изображения, файлы CSS, а также файлы XML, текстовые файлы, шрифты и т. Д., Должны кэшироваться для повышения производительности, но вы все равно хотитечтобы избежать кэширования при их обновлении.
При добавлении временной метки к URL-адресу URL-адрес будет зависеть от самой временной метки ресурса и не позволит промежуточным серверам обслуживать кэшированную версию.
Вы можете заменить временную метку статическим «тегом», таким как «v1», «v2» и т. Д. Однако я предпочитаю вычисленную временную метку, поскольку мне больше не нужно думать об ее обновлении.На самом деле почти все мои ресурсы помечаются автоматически автоматически.
Вот пример PHP:
// This is a simple example, it must be adapted to your environment.
// * $initialUrl is a URL like "//mystyle.css" without any get parameter.
// * $resourceUrl is the (relative) server path to that resource
// which could be "/var/www/mysit/mystyle.css"
// * filemtime gets the timestamp of the resource.
// * baseconvert gets a shorter representation of that timestamp.
// * The timestamp is appended to the URL by simple concatenation here.
// * $url can then be used to generate the HTML (echo ".... $url ...";).
// * This can (should) be wrapped in a function. Personally I have integrated
// it in the MVC Framework I use in an output filter and in a utility
// class method.
$url=$initialUrl.'?ts='.base_convert(filemtime($resourcePath),10, 36);
Примечание
Некоторые из директив могут быть избыточными, но этолучше быть избыточным, чем иметь конкретного пользователя, который испытывает проблемы.Вышесказанное является результатом фактического полевого опыта.Например, «no-transform» был добавлен после удаленной отладки среды пользователя, когда прокси-сервер его мобильного оператора вставлял ресурсы javascript и css прямо в HTML.Это было довольно неожиданно, и в то время это вызывало нежелательное поведение.
Возможности браузера также меняются со временем, и если у вас есть пользователи, которые все еще используют старые браузеры, некоторые не поймут некоторые директивы.
Поэтому я рекомендую играть безопасно и просто добавить как можно больше контрмер.