2012-11-25 12 views
7

Un semplice codice HTML:Come forzare Chrome a non reindirizzare nella cache i reindirizzamenti?

<img src="http://someaddr/image.php"> 

image.php è uno script che restituisce un reindirizzamento a caso a immagini statiche con tutti i necessari intestazioni no-cache:

Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Expires: 0 
Location: http://someaddr/random_image_12345.jpg 

Il problema: durante la navigazione indietro e inoltrare a questa pagina HTML, Chrome (ultimo win/mac) non riconvalida l'indirizzo http://someaddr/image.php.

Ho provato a utilizzare i reindirizzamenti 302 e anche 303 (che in RFC ha il requisito più forte di non essere mai stato memorizzato nella cache dal browser). Funziona come un fascino in IE, FireFox, Opera. Aggiorna sempre http://someaddr/image.php. Ma Chrome no.

Ho persino utilizzato gli Strumenti per sviluppatori in Chrome e sembra che nel registro di rete non venga nemmeno mostrato alcun tentativo (memorizzato nella cache o meno) di recupero dello http://someaddr/image.php. Registro di rete mostra solo una connessione già a http://someaddr/random_image_12345.jpg (nella cache). Perché questo è così rotto ...

So che la soluzione semplice ingenuo/di mettere stringa di query in fonte immagine:

<img src="http://someaddr/image.php?refresh={any random number or timestamp}"> 

Ma non mi piace/non si può usare hack del genere. Ci sono altre opzioni?

+0

Hai provato con 'Scade: -1'? Aggiungi anche "no-store' a pragma –

+0

Scadenza: -1, nessun effetto su Chrome. – thedk

+0

Ho studiato ancora di più il cromo. Ho creato un JavaScript nella pagina, che inserisce dinamicamente lo nel contenuto della pagina. Anche in questo caso Chromes si rifiuta di connettersi all'origine src URL. – thedk

risposta

-3

Da un link ha postato in un'altra domanda:

The first header Cache-Control: must-revalidate means that browser must send validation request every time even if there is already cache entry exists for this object. 
Browser receives the content and stores it in the cache along with the last modified value. 
Next time browser will send additional header: 
If-Modified-Since: 15 Sep 2008 17:43:00 GMT 

This header means that browser has cache entry that was last changed 17:43. 
Then server will compare the time with last modified time of actual content and if it was changed server will send the whole updated object along with new Last-Modified value. 

If there were no changes since the previous request then there will be short empty-body answer: 
HTTP/1.x 304 Not Modified 

È possibile utilizzare etags di HTTP e l'ultima data modificati per garantire che non si sta inviando i dati del browser che ha già nella cache.

$last_modified_time = filemtime($file); 
$etag = md5_file($file); 

header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 

if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
    trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 
+0

Questa risposta non è pertinente al problema. Il problema è che Chrome non tenta nemmeno di connettersi al server. Non è un problema di cache del server e restituisce 304. – thedk

+0

Hmm ... Mio male, sembra che tu l'abbia chiarito quando hai detto che funziona con altri browser. – awm

+0

Ma lei dice che l'aggiunta di un numero casuale funziona; il che significa che chrom sta inviando una richiesta al server. Come lo spieghi? – awm

4

Prova un redirect 307

Ma se sei bloccato cercando di arrivare a un link che non funziona a causa di un redirect cache ...

Questo doesn cancella il cache ma è un percorso veloce e possibile intorno ad esso se ti stai strappando i capelli cercando di raggiungere un link che è stato reindirizzato nella cache.

Copia l'indirizzo del collegamento nella barra degli indirizzi e aggiungi alcune informazioni GET all'indirizzo.

ESEMPIO Se il sito è http://example.com

Put a ?x=y at the end of it 
(example.com?x=y) - the x and y could be anything you want. 

Se esiste già una? nella url con alcune informazioni dopo di esso

(example.com?this=that&true=t) - try to add &x=y to the end of it... 

(example.com?this=that&true=t&x=y) 
+1

Dalla pagina, usando 'window.location', ad esempio, la richiesta get randomizzata è quella che ha funzionato per me. Creo una stringa casuale simile a GUID e la aggiungo come get. E x è tutto ciò di cui hai veramente bisogno, ad esempio 'example.com? X', dove x è un valore chiave casuale. – ps2goat

+0

Nota anche: prova a non utilizzare nulla che lo script del tuo server potrebbe utilizzare, altrimenti potresti ottenere risultati in conflitto ... Per sicurezza potresti semplicemente digitare un po 'di macerie (example.com?kjsdjksdjhkds) – JxAxMxIxN

Problemi correlati