Jaka jest funkcja nagłówka HTTP „Vary: Accept”?

93

Używam PHP do generowania dynamicznych stron internetowych. Jak stwierdzono w poniższym samouczku (patrz łącze poniżej), typ MIME dokumentów XHTML powinien mieć wartość „application / xhtml + xml”, jeśli zezwala na to $ _SERVER ['HTTP_ACCEPT']. Ponieważ możesz obsługiwać tę samą stronę z 2 różnymi MIME („application / xhtml + xml” i „text / html”), ustaw nagłówek HTTP „Vary” na „Accept”. Pomoże to w buforowaniu serwerów proxy.

Link: http://keystonewebsites.com/articles/mime_type.php

Teraz nie jestem pewien implikacji: nagłówek („Vary: Accept”); Nie jestem pewien, co dokładnie zrobi „Vary: Accept” ...

Jedyne wyjaśnienie, które znalazłem, to:

Po nagłówku Content-Type do (jeśli dobrze rozumiem) wysyłany jest nagłówek Vary, który informuje pośredniczące pamięci podręczne, takie jak serwery proxy, że typ zawartości dokumentu różni się w zależności od możliwości klienta, który żąda dokumentu. http://www.456bereastreet.com/archive/200408/content_negotiation/

Każdy może dać mi „prawdziwe” wyjaśnienie tego nagłówka ( z tą wartością ). Myślę, że rozumiem takie rzeczy, jak: Vary: Accept-Encoding, gdzie pamięć podręczna na serwerach proxy może być oparta na kodowaniu wyświetlanej strony, ale nie rozumiem: Vary: Accept

AlexV
źródło
1
Szczerze - nie przejmuj się. Pomijając wady implementacji w tej witrynie, jedyny moment, w którym można uzyskać korzyści z obsługi z typem treści XML, to wykonywanie czynności, których nie można zrobić w tekście / html - i jeśli wszystko to robisz wyłącza Doctype i xmlns, to nie będziesz robić tych rzeczy. Trzymaj się tekstu / html. Jeśli o to chodzi, możesz równie dobrze trzymać się HTML 4.01.
Quentin
Tak, rozumiem to i myślę, że „problemy” takie jak ten pojawiają się zbyt często w tworzeniu stron internetowych. Dzięki „powinno” w specyfikacjach / specyfikacjach RFC!
AlexV
2
Prawdopodobnie powinieneś przeczytać to: blogs.msdn.com/ieinternals/archive/2009/06/17/ ... zanim zaczniesz rozważać użycie VARY.
EricLaw,
1
Ten film ma dobre wyjaśnienie dotyczące Vary:nagłówka.
Kannan Mohan

Odpowiedzi:

94
  • cache-controlNagłówek jest podstawowym mechanizmem serwera HTTP, aby powiedzieć proxy buforowanie „świeżość” z odpowiedzią. (tj. jak / jeśli długo przechowywać odpowiedź w pamięci podręcznej)

  • W niektórych sytuacjach cache-controldyrektywy są niewystarczające. Tutaj zarchiwizowana jest dyskusja grupy roboczej HTTP , opisująca stronę, która zmienia się tylko wraz z językiem. To nie jest poprawny przypadek użycia dla nagłówka zmiennej, ale kontekst jest cenny dla naszej dyskusji. (Chociaż uważam, że nagłówek Vary rozwiązałby problem w tym przypadku, istnieje lepszy sposób.) Z tej strony:

Vary jest przeznaczony wyłącznie do tych przypadków, w których replikacja tego, co zrobiłby serwer, jest beznadziejna lub nadmiernie skomplikowana.

Wymyślony przykład:

Twój serwer HTTP ma dużą stronę docelową. Masz dwie nieco różne strony z tym samym adresem URL, w zależności od tego, czy użytkownik był tam wcześniej. Rozróżniasz żądania i „liczbę odwiedzin” użytkownika na podstawie plików cookie. Ale - ponieważ strona docelowa twojego serwera jest tak duża, chcesz, aby pośredniczące proxy buforowały odpowiedź, jeśli to możliwe.

Adres URL, nagłówki Last-Modified i Cache-Control są niewystarczające, aby dać ten wgląd do buforującego serwera proxy, ale jeśli to dodasz Vary: Cookie, silnik pamięci podręcznej doda nagłówek Cookie do swoich decyzji dotyczących buforowania.

Wreszcie, dla małego ruchu, dynamicznych witryn internetowych - zawsze uważałem, że jest to proste Cache-Control: no-cache, no-storei Pragma: no-cachewystarczające.

Edytuj - aby dokładniej odpowiedzieć na Twoje pytanie: nagłówek żądania HTTP „Akceptuj” określa typy treści, które klient może przetwarzać. Jeśli masz dwie kopie tej samej treści pod tym samym adresem URL, różniące się tylko typem treści, użycie Vary: Acceptmoże być właściwe.

Aktualizacja 11, 12 września:

Dołączam kilka linków, które pojawiły się w komentarzach od czasu opublikowania tego komentarza. Obydwa są doskonałym źródłem przykładów (i problemów) z życia wziętych z Vary: Accept; Jeśli czytasz tę odpowiedź, musisz przeczytać również te linki.

Pierwsza, od znakomitego EricLaw, dotycząca zachowania Internet Explorera z nagłówkiem Vary i niektórych wyzwań, jakie stawia programistom: Vary Header zapobiega buforowaniu w IE . Krótko mówiąc, przeglądarka IE (wcześniejsza niż IE9) nie buforuje żadnej treści używającej nagłówka Vary, ponieważ pamięć podręczna żądań nie zawiera nagłówków żądań HTTP. EricLaw (Eric Lawrence w świecie rzeczywistym) jest kierownikiem programu w zespole IE.

Drugi pochodzi od Erana Medana i jest toczącą się dyskusją na temat nieoczekiwanego zachowania Chrome związanego z Vary: tworzenie kopii zapasowych nie obsługuje poprawnie nagłówka Vary . Jest to związane z zachowaniem IE, z wyjątkiem tego, że twórcy Chrome przyjęli inne podejście - choć nie wydaje się, aby był to celowy wybór.

JJ
źródło
3
Uważaj na to w połączeniu z przyciskiem wstecz przeglądarki w Chrome, jest coś w rodzaju płomiennej wojny z tym błędem (który z jakiegoś powodu jest teraz wontfix) code.google.com/p/chromium/issues/detail?id=94369
Eran Medan,
6
@EranMedan Błąd Chrome został już naprawiony.
59

Vary: Acceptpo prostu mówi, że odpowiedź została wygenerowana na podstawie Acceptnagłówka w żądaniu. Żądanie z innym Acceptnagłówkiem może otrzymać inną odpowiedź.

(Widać, że patrzy na linkowany kod PHP $HTTP_ACCEPT. To jest wartość Acceptnagłówka żądania).

W przypadku pamięci podręcznych HTTP oznacza to, że odpowiedź musi być zapisana w pamięci podręcznej ze szczególną ostrożnością. Będzie to poprawne dopasowanie tylko dla późniejszych żądań z dokładnie tym samym Acceptnagłówkiem .

Teraz ma to znaczenie tylko wtedy, gdy strona jest w pierwszej kolejności buforowana. Domyślnie strony PHP nie są. Strona PHP może oznaczyć wyjście jako buforowalne, wysyłając określone nagłówki ( Expiresna przykład). Ale czy i jak to zrobić, to inna kwestia.

Jason Orendorff
źródło
czy to „może dostać” czy „powinno dostać”?
Pacerier
6
@Pacerier „może dostać” jest poprawne. Vary: Acceptnie oznacza, że ​​każda możliwa odrębna Acceptwartość nagłówka daje inną i niepowtarzalną odpowiedź. Oznacza to tylko, że inny Acceptnagłówek może dać inną odpowiedź.
Jason Orendorff
2

W rzeczywistości wkrótce (i już w Chrome) pojawi się znaczna liczba nowych funkcji, które sprawiają, że Varynagłówek jest niezwykle przydatny. Na przykład rozważ podpowiedź dla klienta . Na przykład, używane w połączeniu z obrazami, podpowiedzi dla klienta umożliwiają serwerowi optymalizację zasobów, takich jak obrazy, w zależności od:

  • szerokość obrazu
  • Szerokość rzutni
  • Typ kodowania obsługiwany przez przeglądarkę (pomyśl o WebP)
  • Downlink (zasadniczo prędkość sieci)

Więc serwer obsługujący te funkcje ustawiłby Varynagłówek, aby to wskazać.

Chrome reklamuje obsługę WebP, ustawiając „image / webp” jako część Varynagłówka każdego żądania. Serwer może więc przepisać obraz na WebP, jeśli przeglądarka go obsługuje, więc serwer proxy musiałby sprawdzić nagłówek, aby nie buforować obrazu WebP, a następnie przesłać go do przeglądarki, która nie obsługuje protokołu WebP. Oczywiście, jeśli Twój serwer tego nie zrobi, nie będzie to miało znaczenia. Ponieważ odpowiedź serwera różni się w Acceptnagłówku żądania, odpowiedź musi zawierać to, aby nie mylić serwerów proxy:

Vary: Accept

Innym przykładem może być szerokość obrazu. W przeglądarce mobilnej Widthnagłówek może być dość mały dla obrazu responsywnego, w porównaniu z tym, co byłby wyświetlany w przeglądarce na komputerze. Więc w takim przypadku Widthzostanie dodany do Varynagłówka jest niezbędny, aby proxy nie buforowało małej wersji mobilnej i nie wyświetlało jej w przeglądarkach stacjonarnych lub odwrotnie. W takim przypadku nagłówek może zawierać:

Vary: Accept, Width

Lub w przypadku, gdy serwer obsługuje wszystkie specyfikacje podpowiedzi klienta, nagłówek będzie wyglądał mniej więcej tak:

Vary: Accept, DPR, Width, Save-Data, Downlink
Brad Berger
źródło