2012-11-25 10 views
7

Prosty kod HTML:Jak zmusić Chrome NIE do buforowania przekierowań?

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

image.php to skrypt, który zwraca losową przekierować do statycznego obrazu z wszystkimi niezbędnymi nagłówków no-cache:

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

Problem: podczas nawigowania wstecz i do tej strony HTML, Chrome (najnowsza win/mac) nie revalidate adres http://someaddr/image.php.

Próbowałem używać przekierowania 302, a także 303 (które w RFC ma silniejsze wymaganie, że NIGDY nie powinno być buforowane przez przeglądarkę). Działa to jak urok w IE, FireFox, Opera. Zawsze odświeżają http://someaddr/image.php. Ale Chrome nie.

Używam nawet Narzędzi dla programistów w Chrome i wygląda na to, że w Dzienniku sieci nawet nie pokazuje żadnej próby (buforowanie lub nie) pobrania http://someaddr/image.php. Dziennik sieci pokazuje tylko jedno połączenie z http://someaddr/random_image_12345.jpg (buforowane). Dlaczego to jest tak uszkodzony ...

Znam naiwny/proste rozwiązanie oddania ciąg kwerendy w źródle obrazu:

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

Ale nie podoba mi się/nie można używać hacki jak to. Czy są jakieś inne opcje?

+0

Czy próbowałeś z 'Expires: -1'? Dodaj także "no-store" do pragma –

+0

Wygasa: -1, brak wpływu na Chrome. – thedk

+0

Zbadałem chrom jeszcze więcej. Zrobiłem JavaScript na stronie, który dynamicznie wstawia do treści strony. Nawet w tym przypadku Chromes odmawia połączenia z źródłowym adresem URL src. – thedk

Odpowiedz

-3

Z link pisał w innym pytaniem:

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 

Można użyć Etags HTTP i ostatniej modyfikacji daty, aby upewnić się, że nie jesteś wysyłania danych przeglądarki, to już jest w pamięci podręcznej.

$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

Ta odpowiedź nie dotyczy problemu. Problem polega na tym, że Chrome nawet nie próbuje połączyć się z serwerem. To nie jest problem z buforowaniem serwera i zwracaniem 304. – thedk

+0

Hmm ... Moje złe, wygląda na to, że jasno to wyjaśniłeś, kiedy powiedziałeś, że działa z innymi przeglądarkami. – awm

+0

Ale wspomniałeś, że dodanie liczby losowej działa; co oznacza, że ​​chrom wysyła zapytanie do serwera. Jak to wyjaśnisz? – awm

4

wypróbować 307 przekierować

Ale jeśli utkniesz próbując dostać się do związku, który nie będzie działać z powodu pamięci podręcznej przekierowanie ...

To nie robi nie wyczyści pamięci podręcznej, ale jest to jedna szybka i możliwa trasa wokół niego, jeśli wyciągasz włosy próbując dostać się do linku, który został przekierowany w pamięci podręcznej.

Skopiuj adres linku do paska adresu i dodaj kilka informacji GET na adres.

Przykład Jeśli witryna jest 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. 

Jeśli już istnieje? w url z niektórymi informacjami po nim

(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

Na stronie, używając 'window.location', na przykład, losowe żądanie pobierania jest tym, które zadziałało dla mnie. Tworzę ciąg losowy typu GUID i dołączam go jako get. A x to wszystko, czego naprawdę potrzebujesz, tj. 'Example.com? X', gdzie x jest losową wartością klucza. – ps2goat

+0

Należy również pamiętać: staraj się nie używać niczego, czego mógłby użyć skrypt serwera, w przeciwnym razie możesz uzyskać sprzeczne wyniki ... Aby być pewnym, możesz po prostu wpisać garble (example.com?kjsdjksdjhkds) – JxAxMxIxN

Powiązane problemy