Принудительное обновление кэша после развертывания - PullRequest
18 голосов
/ 20 января 2012

Есть ли способ заставить клиентский кэш перезагрузить файл HTML, если вы не можете изменить URI, ссылающийся на этот файл (например, не можете добавить параметр метки времени)?

Вот моя ситуация:

  • Плагин, развернутый для 1000 пользователей
  • Этот плагин загружает example.com/page.html, который вызывает script.js
  • URI ресурса example.com/page.html изменить нельзя (без обновлений плагина)
  • page.html было изменено.Мне нужно очистить старый page.html из кэша пользователей, чтобы можно было загрузить новый page.html.

Есть идеи?Htaccess?PHP API, который вызывали старые и новые page.html?

Спасибо!

Ответы [ 3 ]

30 голосов
/ 20 января 2012

Что ж, если страница уже кэширована браузером, трудно сказать ей, чтобы она не использовала свою кэшированную версию, потому что она, вероятно, не потрудится проверить еще раз, прежде чем определит, что ее кэшированная версия устарела. Вам просто нужно отправить письмо обычной почтой всем вашим пользователям, сообщив им нажать Ctrl + F5:)

Однако существует вероятность, что браузер, по крайней мере, попытается выполнить запрос HEAD, чтобы проверить измененную метку времени, прежде чем он предоставит свою кэшированную версию. В этом случае вам поможет следующее:

Браузеры согласовывают свое содержимое с вашим веб-сервером, используя стандартные заголовки HTTP. В дальнейшем, если вы хотите сказать браузеру не кэшировать файл, вы должны отправить соответствующие HTTP-заголовки. Если вы хотите сделать это в PHP, вы можете использовать функцию header для отправки соответствующих заголовков HTTP в браузер:

header('Cache-Control: no-cache');
header('Pragma: no-cache');

Если это нужно сделать с помощью HTML, вы можете сделать следующее в заголовке страницы:

<meta http-equiv="Expires" content="Tue, 01 Jan 1995 12:12:12 GMT">
<meta http-equiv="Pragma" content="no-cache">

Однако вы не можете быть уверены, что браузер выполнит ваш запрос о том, чтобы он не кэшировал страницу. Есть и другие вещи, такие как eTags и еще много чего, но, честно говоря, я не думаю, что это поможет вам, если страница уже кэширована.


UPDATE

Из спецификации HTTP / 1.1 в Кэширование ответов :

Если нет ни валидатора кэша, ни явного времени истечения связанный с ответом, мы не ожидаем, что он будет кэширован, но некоторые кэши МОГУТ нарушать это ожидание (например, когда мало или нет подключения к сети).

4 голосов
/ 22 февраля 2013

Возможно, PHP можно использовать для добавления метки времени к вызову javascript. Затем вы можете запустить это на время ........... Например:

check_if_cache_should_be_disabled.php

<?php
$deployment_flag = true; // Uncomment this if you want to disable normal cache.
//$deployment_flag = false // Uncomment this if you want to enable normal cache.
?>

page.php

<script src="/js/script.js<?php 
require('check_if_cache_should_be_disabled.php');
//  File Get Contents can be used for a remote server
//file_get_contents('http://yourserver.com/check_if_cache_should_be_disabled.php');
if ($deployment_flag == true) {
print ( '?ts='.date() );
}
?>"></script>
0 голосов
/ 03 мая 2015

Вы можете изменить имя файла, например page_v2.html, что заставит браузер загрузить страницу как новую страницу.

...