web-dev-qa-db-fra.com

Forcer l'actualisation du cache après le déploiement

Existe-t-il un moyen de forcer le cache d'un client à recharger un fichier HTML si vous ne pouvez pas modifier l'URI référençant ce fichier (par exemple, vous ne pouvez pas ajouter de paramètre timestamp)?

Voici ma situation:

  • Un plugin déployé auprès de 1000 utilisateurs
  • Ce plugin charge example.com/page.html qui appelle script.js
  • L'URI de la ressource example.com/page.html ne peut pas être modifié (sans mises à jour de plug-in)
  • page.html a été changé. Je dois effacer l'ancien page.html du cache des utilisateurs pour que le nouveau page.html puisse se charger.

Des idées? Htaccess? L'API PHP utilisée par l'ancien et le nouveau page.html?

Merci!

18
Kyle

Eh bien, si la page est déjà mise en cache par un navigateur, il est difficile de lui dire de ne pas utiliser sa version en cache car elle ne se souciera probablement pas de vérifier à nouveau avant de déterminer que sa version en cache est périmée. Il vous suffira d'envoyer une lettre par courrier électronique à tous vos utilisateurs, leur demandant d'appuyer sur les touches ctrl + f5 :)

Cependant, il est possible que le navigateur essaie au moins une requête HEAD pour vérifier l'horodatage modifié avant de servir sa version mise en cache. Dans ce cas, ce qui suit vous aidera.

Les navigateurs négocient leur contenu à partir de votre serveur Web à l'aide d'en-têtes standard HTTP. À l'avenir, si vous souhaitez dire à un navigateur de ne pas mettre en cache un fichier, vous devez envoyer les en-têtes HTTP appropriés. Si vous voulez le faire dans PHP, vous pouvez utiliser la fonction header pour envoyer les en-têtes HTTP appropriés au navigateur:

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

Si cela doit être fait via HTML, vous pouvez effectuer les opérations suivantes dans l'en-tête de votre page:

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

Cependant, vous ne pouvez absolument pas vous assurer que le navigateur acceptera votre requête de ne pas mettre en cache une page. Il y a quelques autres choses comme les étiquettes électroniques et tout le reste, mais franchement, je ne pense pas que cela puisse vous aider si la page est déjà en cache.


METTRE &AGRAVE; JOUR

A partir de la spécification HTTP/1.1 sur Réponse Cacheability :

S'il n'y a ni validateur de cache ni date d'expiration explicite associé à une réponse, nous ne nous attendons pas à ce qu’elle soit mise en cache, mais certaines caches PEUVENT violer cette attente (par exemple, lorsque peu ou pas de connectivité réseau est disponible).

29
rdlowrey

Peut-être PHP pourrait être utilisé pour ajouter un horodatage à l'appel javascript. Vous pouvez ensuite exécuter ceci pour la durée ........... Par exemple:

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>
4
user2097982

Vous pouvez modifier le nom du fichier, par exemple page_v2.html, ce qui obligera le navigateur à charger la page en tant que nouvelle page.

0
DeepBlue