2013-04-23 18 views
11

Mimo że wysyłam "kontrolę pamięci podręcznej: konieczna rewalidacja", Google Chrome używa strony buforowanej lokalnie, gdy używasz przycisku wstecz i do przodu w przeglądarce.Google Chrome nie rewaliduje etagu z powrotem/z powrotem

Jest częścią oryginalnej odpowiedzi:

HTTP/1.1 200 OK 
cache-control: private, must-revalidate 
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e" 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

Gdybym odśwież stronę otrzymuję „HTTP/1.1 304 Not Modified” odpowiedzi, ale kiedy użyć przycisku Wstecz otrzymuję następującą odpowiedź:

Request URL:example.com 
Request Method:GET 
Status Code:200 OK (from cache) 

Odpowiedź, której szukam, to 304 lub 200 OK, czy można to osiągnąć?

Odpowiedz

13

Przy użyciu przycisków wstecz i do przodu, kluczem Cache-Control dyrektywy, aby zapobiec przeglądarkę przekazujących pamięci podręcznej kopię strony jest no-store.

Nic innego nie pomoże i nic więcej nie jest potrzebne. Twój Cache-Control Nagłówek może być po prostu:

Cache-Control: no-store 

Istnieją dwa wyjątki od tej chociaż.

  1. Opera i Safari nie zostaną ponownie zweryfikowane, bez względu na ustawione nagłówki (przynajmniej wersje testowane przeze mnie). Jeśli otworzysz stronę w nowej karcie, ta kopia będzie świeża, ale oryginalna karta będzie nadal wyświetlać nieaktualną wersję podczas nawigowania w tę iz powrotem, dopóki nie odświeżysz lub nie wprowadzisz ponownie adresu URL.
  2. Wygląda na to, że Firefox ma błąd w buforowaniu pierwszej strony, która jest otwarta (np. Gdy nie ma przycisku wstecz). Wszystkie kolejne wystąpienia strony będą się odświeżać podczas nawigacji w tę iz powrotem, ale po wykonaniu kopii zapasowej na najwyższą stronę, często może ona nadal pokazywać początkową nieaktualną kopię.

Wreszcie, powinienem zauważyć, że stosowanie tej dyrektywy nie jest ogólnie zalecane, ponieważ ma to oczywiście znaczący wpływ na wykorzystanie przepustowości. Przeglądarka nie może nawet skorzystać z Etags, aby uzyskać odpowiedź 304 Not Modified, ponieważ nie będzie miała zapisanej kopii do użycia w przypadku otrzymania odpowiedzi 304.

+1

Więc jeśli chcesz, aby przycisk "Wstecz/Dalej" działał, nie możesz korzystać z etagów? – Dennis

+1

Tak. Właśnie to znalazłem we wszystkich testach, które zrobiłem. –

+0

http://madhatted.com/2013/6/16/you-do-not-understand-browser-history zawiera interesującą dyskusję na temat sytuacji. – Gili

3

"Dyrektywa o konieczności przedłużenia ważności" ma zastosowanie tylko po tym, jak odpowiedź jest nieaktualna (RFC2616, sec 14.9.4). Ponieważ odpowiedź nie zawiera ani nagłówka "Wygasa", ani dyrektywy "maksymalny wiek", przeglądarka mogła potraktować odpowiedź jako wciąż świeżą i odpowiednio zwróciła kopię z pamięci podręcznej. Aby temu zapobiec, powinieneś dodać "max-age: 0" w nagłówku Cache-Control (i ewentualnie nagłówek Expires zawierający datę w przeszłości), aby buforowana odpowiedź natychmiast się zestarzeła. Ewentualnie, aby zapobiec buforowaniu, użyj dyrektywy "no-cache" zamiast "must-revalidate".

+1

Od 13.2.4 dokumentu RFC2616: "Dyrektywa maksymalnego wieku ma pierwszeństwo przed upływem ważności". Nie potrzebujesz obu. W każdym razie, żadna z nich nie uniemożliwi przeglądarce wyświetlania nieaktualnej kopii podczas nawigacji za pomocą przycisku Wstecz. –

+0

Właśnie potwierdziłem komentarz Jamesa, rozwiązanie nie działa z przyciskiem Wstecz. – Dennis

2

Dyrektywę dotyczącą pamięci podręcznej no-store można użyć w celu zalecenia przeglądarce, aby nie zapisywała stron w pamięci podręcznej dysku. W połączeniu z no-cache powinno to zapewnić, że wszystkie przeglądarki będą pobierać zasoby z źródła, a nie z dysku.

Cache-Control: private, no-cache, no-store

+0

Z wyjątkiem tego, że chcę, aby przeglądarka ponownie uwierzytelniła etage podczas nawigacji w tę iz powrotem. – Dennis

+2

To naruszyłoby RFC2616 sekcja 13.13 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html), która określa, że ​​przeglądarki NIE powinny rewalidować: "Mechanizmy historyczne i pamięci podręczne są różne, w szczególności mechanizmy historyczne NIE POWINIEN próbować aby pokazać semantycznie przejrzysty widok bieżącego stanu zasobu, a raczej mechanizm historii ma pokazać dokładnie to, co zobaczył użytkownik w momencie pobrania zasobu. " Przeglądarki, które nie rewalidują lub nie pobierają wygasłych stron, do których dostęp uzyskał za pomocą przycisku Wstecz, faktycznie robią PRAWĄ rzecz - po prostu nie jest to, czego chcesz. – SpliFF

+1

Tylko 'no-store' działa, ponieważ przeglądarka nie ma wyboru, nie ma lokalnej kopii do wyświetlenia, więc musi ją pobrać. – SpliFF