2011-11-28 24 views
35

mam te nagłówki są wysyłane do klienta przez serwer:przeglądarka Chrome nie wysyła If-Modified-od nagłówka do serwera

Cache-Control:private 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Type:text/html 
Date:Sun, 27 Nov 2011 11:10:38 GMT 
ETag:"12341234" 
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly 
Transfer-Encoding:chunked 
last-modified:Sat, 26 Nov 2011 21:42:45 GMT 

chcę klient, aby potwierdzić, że plik nie został zmieniony na serwer i wyślij "200", jeśli w przeciwnym razie jest to "304".

Firefox wysyła:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT 
if-none-match: "12341234" 

Dlaczego nie jest chrom wysyłania samo na odświeżenie strony? Jestem po zachowanie, że .Net działa:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate) 
+0

nie rozumiem „Jestem po zachowań .Net działa: ". Czy mógłbyś to edytować? Pytanie jest dla mnie ważne. –

+0

Chodziło o to, aby uzyskać zachowanie, które można uzyskać po uruchomieniu kodu po ':' w .Net. Patrząc na znaczniki próbowałem naśladować zachowanie w node.js. – Asken

+0

Dla wszystkich, którzy uważają, że jest to strona po stronie klienta i głosujcie na te odpowiedzi. Przeczytaj to: Jest związany z serwerem, ponieważ robię żądanie przeglądarki za pomocą etag ('if-none-match'). Etag jest tworzony po stronie serwera i nie ma nic wspólnego z klientem. Muszę wiedzieć, co wysłać z serwera do klienta, aby wysłać również nagłówek etag w chrome. Wybrana odpowiedź jest jedyną słuszną, ponieważ nakazuje serwerowi wysłanie również polecenia "if-none-match". – Asken

Odpowiedz

9

Z mojego doświadczenia potrzebujesz czegoś więcej niż tylko "Prywatne" nagłówek Cache-Control. Aby zmusić Chrome do ponownej weryfikacji zawartości na serwerze, musisz mieć "Max-Age" lub "Expires".

Należy pamiętać, że ponowna walidacja rozpocznie się dopiero po upływie tych wartości czasu, więc może być konieczne ustawienie ich na małą wartość.

+0

Próbowałem kontroli pamięci podręcznej: prywatny, max-age = 0. Nie działa ... żadnych innych pomysłów? Dodałem również nagłówek wygasania, ale nadal nie mam wyjścia. – Asken

+0

Właściwie ... powinien być max-age = 100000 lub coś podobnego. Prawie udało się to do pracy. Postaraj się wysłać, jeśli nie pasuje, kilka razy, więc to działa. Dzięki! – Asken

+0

Zwykle ustawiam Maks. Wiek na 1 godzinę, ale zależy to od tego, jak często aktualizujesz swoją statyczną zawartość. Jeśli nie jesteś pewien, zachowaj niską wartość, aby być po bezpiecznej stronie. –

53

Po spędzeniu w tym dniu pół dnia, wyśledziłem, co było przyczyną problemu. Dopóki masz inspektora obiektów Chrome/Debugera klienta/Monitora sieci/Thing, który pojawia się po naciśnięciu F12, Chrome nie będzie wysyłał nagłówków żądań cache. Kropka. (aktualizacja: w nowszych wersjach Chrome jest pole wyboru "Wyłącz pamięć podręczną"). Nawet jeśli nie masz otwartej zakładki "sieć" (np. Masz otwartą konsolę javascript), to pole wyboru w dalszym ciągu wyłącza cacheing.

To smutne, ponieważ debugowanie tego po stronie klienta zobowiązuje Cię do opuszczenia otwartego panelu sieciowego, aby zobaczyć, jakie nagłówki są wysyłane i odbierane oraz jakie kody są zwracane. Bez otwartego panelu sieciowego nie można ustalić, czy zawartość jest buforowana po stronie klienta.

Jeśli zagłębisz się w dzienniki dostępu do serwera, zauważysz, że serwer powraca 304 (zawartość buforowana) zaraz po zamknięciu okna debugowania na kliencie Chrome. Mam nadzieję że to pomoże.

Chrome 24.0.1312.57

+43

Narzędzia programistyczne mają opcję "Wyłącz pamięć podręczną (gdy program DevTools jest otwarty)", być może masz włączone? Kliknij ikonę "koła zębatego" w prawym dolnym rogu i sprawdź ustawienia. – Neek

+0

+1 (tak, musisz usunąć zaznaczenie "Wyłącz pamięć podręczną (gdy program DevTools jest otwarty)"). –

+2

To nie jest odpowiedź, a odpowiedź jest związana z serwerem. – Asken

24

znalazłem jedną odpowiedź do tego zachowania przy użyciu protokołu HTTPS, myślałem, że będę dzielić się znalazłem. Nie określasz, czy żądasz przez HTTP lub HTTPS.

"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

To wydaje się już nie być prawdą. Mam stronę, na której przeglądarka wysyła nagłówki 'if-modified-since' dla niektórych zasobów i nie wysyła ich do innych. – pbanka

+0

W przeciwieństwie do poprzedniego komentarza, widziałem dokładnie to samo zachowanie. Zmodyfikowano - jeśli nie został wysłany w środowisku, w którym miałem nieważny certyfikat, ale został wysłany, gdy miałem ważny. – dmccabe

+0

Dziękuję, też miałem ten problem. Używałem samopodpisanych testów certyfikatów na maszynie dev. Jako test, tymczasowo ufałem certyfikatowi i zacząłem otrzymywać 304 zgodnie z oczekiwaniami. – Steviebob

0

Wiem, że to pytanie jest stare, ale nadal .. Zauważyłem, że chrome zapamiętuje ostatnie odświeżenie, które zrobiłeś. Więc jeśli naciśniesz ctrl + shift + r (odświeżanie i usuwanie pamięci podręcznej) i naciśnięcie ctrl + r (tylko odświeżanie), chrome kontynuuje usuwanie pamięci podręcznej i nie pokazuje 304 w odebranej odpowiedzi. Istnieje obejście tego problemu. Naciśnij ctrl + shift + r, a następnie przejdź do paska adresu, ustaw ostrość i naciśnij enter. Jeśli twoje etagi są ustawione poprawnie, a twój serwer jest gotowy do obsługi 304, zobaczysz nowy kod odpowiedzi w debugerze - 304. więc działa.

+0

To nie jest problem klienta ... – Asken

+0

Obserwowałem to zachowanie na wielu stronach. Błąd klienta lub nie, nadal dobrze jest wiedzieć, że czasami cmd + r może nie wystarczyć. –

+1

Zaakceptowana odpowiedź pomoże witrynie (s), w której nie działa i nie zmuszają użytkowników witryny do robienia rzeczy, których nie powinni. – Asken

4

Ponadto (https://stackoverflow.com/a/14899869/362780):

F12> Ustawienia> Ogólne> Wyłącz cache (podczas DevTools jest otwarta) -> odznacz to ...

+0

Wyłącz pamięć podręczną nie jest zaznaczona, a problem nadal występuje. Używam wersji 58.0.3029.110 (64-bitowej). – Reado

Powiązane problemy