2012-01-20 21 views
17

C'è un modo per forzare la cache di un client per ricaricare un file HTML se non è possibile modificare l'URI che fa riferimento a quel file (ad es., Non è possibile aggiungere un parametro timestamp)?Aggiornamento forzato della cache dopo l'implementazione

Ecco la mia situazione:

  • Un plugin distribuito a un 1000 utenti
  • quel plugin carichi example.com/page.html che invita script.js
  • La risorsa URI example.com/page.html non può essere modificato (w/o aggiornamenti plugin)
  • page.html è stato modificato. Devo cancellare il vecchio page.html dalla cache degli utenti in modo da poter caricare il nuovo page.html.

Qualche idea? Htaccess? L'API PHP che chiama il vecchio & new page.html?

Grazie!

risposta

29

Bene, se la pagina è già stata memorizzata nella cache da un browser, è difficile dirgli di non utilizzare la sua versione memorizzata nella cache perché probabilmente non si preoccuperà di controllare di nuovo prima che determini che la versione della cache è scaduta. Dovrai solo inviare una lettera di posta ordinaria a tutti i tuoi utenti per informarli di premere ctrl + f5 :)

C'è una possibilità che il browser possa almeno provare una richiesta HEAD per controllare il timestamp modificato prima serve comunque la sua versione memorizzata nella cache. In questo caso, il seguente ti aiuterà.

I browser negoziano il loro contenuto dal server Web utilizzando le intestazioni standard HTTP. Andando avanti se vuoi dire a un browser di non memorizzare nella cache un file, devi inviare le intestazioni HTTP appropriate. Se si vuole fare questo in PHP è possibile utilizzare la funzione di header per inviare le intestazioni HTTP appropriate per il browser:

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

Se deve essere fatto tramite HTML è possibile effettuare le seguenti operazioni nell'intestazione pagina:

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

Non c'è modo per voi di essere certi che il browser rispetterà la vostra richiesta di non memorizzare nella cache una pagina. Ci sono altre cose come eTags e quant'altro, ma francamente non penso che ti possa aiutare se la pagina è già in cache.


UPDATE

Dalla specifica HTTP/1.1 su Response Cacheability:

Se non v'è né una convalida della cache né il tempo una scadenza esplicita associata ad una risposta, non lo facciamo aspettatevi che venga memorizzato nella cache, ma alcune cache POSSONO violano questa aspettativa (ad esempio, quando la piccola o nessuna connettività di rete è disponibile).

+0

non sono sicuro se questo compia il mio obiettivo. Il file PHP su cui ho il controllo è un'API chiamata da un file js da 'example.html'. La soluzione 'header' che hai fornito sembra funzionare solo per il file php stesso? O funzionerebbe per tutte le risorse sullo stesso dominio? Per quanto riguarda la soluzione HTML, funziona se il vecchio file 'esempio.html' includeva già quei tag, ma come descritto sopra, non è il caso della mia situazione. – Kyle

+0

Altrimenti detto, sto provando a caricare un nuovo 'example.html' su un vecchio' example.html' che è già stato memorizzato nella cache. – Kyle

+0

Purtroppo, una volta che il browser ha memorizzato nella cache qualcosa, non c'è molto che si possa fare a riguardo. La cosa buona è che la maggior parte dei browser non memorizza le cose per molto tempo. Ho solo i fatti della vita, temo. – rdlowrey

4

Forse PHP può essere utilizzato per aggiungere un timestamp alla chiamata javascript. Potresti quindi eseguirlo per la durata ...........Per esempio:

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

È possibile modificare il nome del file, ad esempio page_v2.htmlche renderà il borwser caricare la pagina come una nuova pagina.

Problemi correlati