2012-04-06 15 views
5

Chcę, aby przeglądarki zawsze dodawały nagłówek żądania "If-Modified-Since" (za pierwszym razem), aby uniknąć niepotrzebnego ruchu.Chrome nie wysyła "If-Modified-Since"

nagłówki odpowiedzi są:

Accept-Ranges:bytes 
Cache-Control:max-age=0, must-revalidate 
Connection:Keep-Alive 
Content-Length:2683 
Content-Type:text/html; charset=UTF-8 
Date:Thu, 05 Apr 2012 13:06:19 GMT 
Keep-Alive:timeout=15, max=497 
Last-Modified:Thu, 05 Apr 2012 13:05:11 GMT 
Server:Apache/2.2.21 (Red Hat) 

FF i IE 9 11 zarówno wyślij "If-Modified-Since" i dostać 304 w odpowiedzi ale Chrome 18 i nie robi się 200.

Dlaczego? Jak zmusić Chrome do wysłania nagłówka "If-Modified-Since"? Nie wiem, czy to ważne, czy nie, ale wszystkie żądania przechodzą przez HTTPS.

+0

Na koniec dnia, to aż do przeglądarek, a wszelkie skrytek pośrednich, czy * będzie * faktycznie cache zawartość (można kontrolować, czy * powinien *). Nie będzie można w 100% uniemożliwić aplikacjom użytkownika ponownego żądania treści. –

+3

Zauważyłem, że Chrome nie wysyła nagłówka If-Modified-Since, chyba że odpowiedzią jest gzip. Nie jestem pewien, czy to jest prawdziwy wzorzec, czy tylko moje doświadczenie próbujące radzić sobie z aktualizowaniem plików JS. – Ryan

+0

Jakiś konkretny powód wysłania Keep-Alive? –

Odpowiedz

20

Od pewnego czasu ścigam ten problem, sądzę, że podzielę się tym, co znalazłem.

"Zasada jest bardzo prosta: każdy błąd związany z certyfikatem oznacza, że ​​strona nie zostanie zapisana w pamięci podręcznej."

https://code.google.com/p/chromium/issues/detail?id=110649

Jeśli używasz certyfikatu z podpisem własnym, nawet jeśli powiesz Chrome, aby dodać wyjątek dla niej tak, że będą buforowane załadowaniu strony, bez środków z tej strony, a kolejne wnioski nie będą mieć nagłówek If-Modified-Since.

+0

Whew, uratował mnie mnóstwo czasu - dzięki! –

+0

Holy crap. Wziął mnie na zawsze, aby się na to natknąć, ale to był dokładnie problem, do którego uciekłem. Dzięki za tonę! – Snekse

+0

Dziękuję @Neek. Uratowałeś mi czas i uratowałeś mnie od frustracji: D –

4

Zauważyłem prawie takie samo zachowanie i moje wnioski są następujące:

  • Przede wszystkim wskaźnik 200 stanu w Chrome nie jest cała prawda, trzeba spojrzeć na „Rozmiar treści” kolumna także. Jeśli jest napisane "(z pamięci podręcznej)" zasób został pobrany bezpośrednio z pamięci podręcznej, nawet nie pytając, czy został zmodyfikowany.

  • To zachowanie pamięci podręcznej zasobów, które nie mają żadnych informacji o wygasaniu lub maksymalnym wieku, wydaje się mieć zastosowanie do żądań plików statycznych, które mają ostatnio zmodyfikowany nagłówek. Zauważyłem, że chrom (wersja 22):

    1. Pyta o plik za pierwszym razem (oczywiście, ponieważ nie jest w pamięci podręcznej).
    2. Pyta, czy jest modyfikowany po raz drugi (ponieważ znajduje się w pamięci podręcznej, ale nie ma oznak świeżości).
    3. Używa go bezpośrednio po raz trzeci, a następnie (nawet jeśli jest to nowa sesja przeglądarki).
  • jestem trochę zaskoczony przez to zachowanie, ale to jest dość rozsądne, jeżeli jest statyczna, zmodyfikowano dawno temu, i nie zmieniła się od ostatniego sprawdzenia was mógłby przypuszczać, że to będzie zachowują ważność przez jakiś czas (nie wiem jak to obliczyć).

+0

Witam @Albert Bertilsson 1. prosi o plik za pierwszym razem ** 2. ** 3. **, czy to twój wniosek?Nie sądzę, żeby to było słuszne, a polityka, której używał chrome cache, powinna być czynnikiem LM, a nie tym, co powiedziałeś. Jeśli odsyłasz to z oficjalnego dokumentu google, proszę przejść obok linku, bardzo dużo. – materliu

+0

Odnośnie ostatniego punktu, w jaki sposób przeglądarka wie, czy plik jest statyczny? –

3

Właśnie znalazłem to pytanie i po zastanowieniu się nad zachowaniem przeglądarki Chrome If_Modified_Since znalazłem odpowiedź.

Decyzja Chrome o buforowaniu plików jest oparta na otrzymanym nagłówku Expires.Nagłówek Expires ma dwa główne wymagania:

  1. To musi być w Greenwich Mean Time (GMT), a
  2. To musi być sformatowane według RFC 1123 (który jest w zasadzie RFC 822 z czterocyfrowym rok).

format jest następujący:

Expires: Sat, 07 Sep 2013 05:21:03 GMT 

Przykładowo, PHP następujące wyjścia prawidłowo sformatowany nagłówek.

$duration = time() + 3600 // Expires in one hour. 
header("Expires: " . gmdate("D, d M Y H:i:s", $duration) . " GMT"); 

(„GMT” jest dołączany do łańcucha zamiast „e” flaga stref czasowych, ponieważ w przypadku korzystania z gmdate(), flaga wyświetli „UTC”, który RFC 1123 uważa nieważny. Należy również pamiętać, że PHP constantsDateTime::RFC1123 i DATE_RFC1123nie zapewnienia prawidłowego formatowania, ponieważ wyjście różnica GMT w godzinach[tj +02: 00]. zamiast „GMT”)

Zobacz W3C's date/time format specifications aby uzyskać więcej informacji.

W skrócie, Chrome rozpoznaje nagłówek tylko, jeśli będzie zgodny z tym formatem. To, w połączeniu z nagłówkiem Cache-Control ...

header("Cache-Control: private, must-revalidate, max-age=" . $duration); 

... pozwoliła mi realizować właściwą kontrolę cache. Gdy Chrome rozpoznał te nagłówki, zaczął buforować strony, które wysłałem (nawet z ciągami zapytań!), A także zaczął wysyłać nagłówek If_Modified_Since. Porównałem go do zapisanej daty "ostatniej modyfikacji", odesłano HTTP/1.1 304 Not Modified i wszystko działało idealnie.

Mam nadzieję, że to pomoże każdemu, kto się potknie!

2

Miałem ten sam problem w Chrome wszystkie wnioski były zawsze stan kod 200, w innych przeglądarkach 304.

Okazało się, miałem wyłączyć pamięć podręczną (podczas DevTools jest otwarta) zameldowałem się w DevTools - Ustawienia - strona Ogólne .. :)

+0

dokładnie to, co miałem przed oczami ... dzięki koleśowi –

0
  1. Nie wyłączaj pamięci podręcznej w Narzędziach Chrome Dev (na karcie "Sieć").
  2. Cache-Control powinien być Cache-Control: public. Użyj true jako drugi parametr do header PHP Funkcja: header("Cache-Control: public", true);
Powiązane problemy