2012-01-20 3 views
17

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

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

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

Любые идеи? Htaccess? API PHP, который старый & новый page.html звонок?

Спасибо!

ответ

29

Ну, если страница уже кэширована браузером, сложно сказать, что она не использует свою кешированную версию, потому что, вероятно, она не будет проверять снова, прежде чем она определит, что ее кешированная версия устарела. Вам просто нужно отправить письмо с уличной почтой всем вашим пользователям, сообщив им, чтобы они нажали 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 спецификации на Response Cacheability:

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

+0

не уверен, что это выполнит мою цель. Файл PHP, над которым я управляю, - это API, вызываемый js-файлом из 'example.html'. Решение 'header', которое вы указали, похоже, что оно работает только для самого файла php? Или он будет работать для всех ресурсов в одном домене? Что касается HTML-решения, это работает, если старый файл example.html уже содержит те теги, но, как описано выше, это не относится к моей ситуации. – Kyle

+0

В противном случае, я пытаюсь загрузить новый 'example.html' поверх старого' example.html', который уже кэшируется. – Kyle

+0

К сожалению, как только браузер кэширует что-то, вы не можете много сделать. Хорошо, что большинство браузеров не кэшируют вещи в течение длительного времени. Боюсь, только факты жизни. – rdlowrey

4

Возможно, 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

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

Смежные вопросы