Qual è la funzione dell'intestazione HTTP "Vary: Accept"?


93

Uso PHP per generare pagine Web dinamiche. Come affermato nel seguente tutorial (vedi link sotto), il tipo MIME dei documenti XHTML dovrebbe essere "application / xhtml + xml" quando $ _SERVER ['HTTP_ACCEPT'] lo consente. Dato che puoi pubblicare la stessa pagina con 2 diversi MIME ("application / xhtml + xml" e "text / html") dovresti impostare l'intestazione HTTP "Vary" su "Accept". Questo aiuterà la cache sui proxy.

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

Ora non sono sicuro dell'implicazione di: header ('Vary: Accept'); Non sono proprio sicuro di cosa farà esattamente "Vary: Accept" ...

L'unica spiegazione che ho trovato è:

Dopo l'intestazione Content-Type, viene inviata un'intestazione Vary (se la capisco correttamente) per indicare alle cache intermedie, come i server proxy, che il tipo di contenuto del documento varia a seconda delle capacità del client che richiede il documento. http://www.456bereastreet.com/archive/200408/content_negotiation/

Chiunque può darmi una spiegazione "reale" di questa intestazione ( con quel valore ). Penso di capire cose come: Vary: Accept-Encoding dove la cache sui proxy potrebbe essere basata sulla codifica della pagina servita, ma non capisco: Vary: Accept


1
Francamente, non preoccuparti. Lasciando da parte i difetti nell'implementazione su quel sito, l'unica volta in cui otterrai benefici dal servire con un tipo di contenuto XML è quando fai cose che non possono essere fatte in text / html - e se tutto ciò che stai facendo sta cambiando il Doctype e xmlns, quindi non farai quelle cose. Attenersi a testo / html. Del resto, potresti anche restare fedele all'HTML 4.01.
Quentin

Sì, lo capisco e penso che "problemi" come questo sorgano troppo spesso nello sviluppo Web. Grazie a "dovrebbe" nelle specifiche / RFC!
AlexV

2
Probabilmente dovresti leggere questo: blogs.msdn.com/ieinternals/archive/2009/06/17/… prima di considerare l'utilizzo di VARY.
EricLaw

1
Questo video ha una buona spiegazione sull'intestazione Vary:.
Kannan Mohan

Risposte:


94
  • L' cache-controlintestazione è il meccanismo principale con cui un server HTTP comunica a un proxy di cache la "freschezza" di una risposta. (cioè, come / se a lungo memorizzare la risposta nella cache)

  • In alcune situazioni, le cache-controldirettive sono insufficienti. Qui è archiviata una discussione del gruppo di lavoro HTTP , che descrive una pagina che cambia solo con la lingua. Questo non è il caso d'uso corretto per l'intestazione Varia, ma il contesto è prezioso per la nostra discussione. (Anche se credo che l'intestazione Vary risolverebbe il problema in quel caso, c'è un modo migliore.) Da quella pagina:

Vary è strettamente per quei casi in cui è inutile o eccessivamente complicato per un proxy replicare ciò che farebbe il server.

Un esempio artificioso:

Il tuo server HTTP ha una grande pagina di destinazione. Hai due pagine leggermente diverse con lo stesso URL, a seconda che l'utente ci sia già stato. Si distingue tra richieste e "conteggio visite" di un utente in base ai cookie. Tuttavia, poiché la pagina di destinazione del tuo server è così grande, vuoi che i proxy intermedi memorizzino la risposta nella cache, se possibile.

Le intestazioni URL, Last-Modified e Cache-Control non sono sufficienti per fornire questa visione a un proxy di cache, ma se aggiungi Vary: Cookie, il motore di cache aggiungerà l'intestazione Cookie alle sue decisioni di memorizzazione nella cache.

Infine, per il traffico ridotto, i siti web dinamici - ho sempre trovato il semplice Cache-Control: no-cache, no-storee Pragma: no-cachesufficiente.

Modifica: per rispondere in modo più preciso alla tua domanda: l'intestazione della richiesta HTTP "Accetta" definisce i tipi di contenuto che un client può elaborare. Se hai due copie dello stesso contenuto allo stesso URL, che differiscono solo per il tipo di contenuto, l'utilizzo Vary: Acceptpotrebbe essere appropriato.

Aggiornamento 11 settembre 12:

Includo un paio di link che sono apparsi nei commenti da quando questo commento è stato originariamente pubblicato. Sono entrambe eccellenti risorse per esempi (e problemi) del mondo reale con Vary: Accept; Se stai leggendo questa risposta, devi leggere anche quei link.

Il primo, dall'eccezionale EricLaw, sul comportamento di Internet Explorer con l'intestazione Vary e alcune delle sfide che presenta agli sviluppatori: Vary Header previene la memorizzazione nella cache in IE . In breve, IE (pre IE9) non memorizza nella cache alcun contenuto che utilizza l'intestazione Vary perché la cache delle richieste non include le intestazioni delle richieste HTTP. EricLaw (Eric Lawrence nel mondo reale) è un Program Manager nel team di IE.

Il secondo è di Eran Medan ed è una discussione in corso sul comportamento imprevisto correlato a Vary in Chrome: Backing non gestisce correttamente l'intestazione Vary . È correlato al comportamento di IE, tranne per il fatto che gli sviluppatori di Chrome hanno adottato un approccio diverso, anche se non sembra essere stata una scelta deliberata.


3
Attenzione a questo in combinazione con il pulsante Indietro del browser in Chrome, c'è una sorta di guerra contro questo bug (che ora non verrà risolto per qualche motivo) code.google.com/p/chromium/issues/detail?id=94369
Eran Medan

6
@EranMedan Il bug di Chrome da allora è stato risolto.

59

Vary: Acceptdice semplicemente che la risposta è stata generata in base all'intestazione Acceptnella richiesta. Una richiesta con Acceptun'intestazione diversa potrebbe ottenere una risposta diversa.

(Puoi vedere che il codice PHP collegato guarda $HTTP_ACCEPT. Questo è il valore dell'intestazione della Acceptrichiesta.)

Per le cache HTTP, ciò significa che la risposta deve essere memorizzata nella cache con particolare attenzione. Sarà una corrispondenza valida solo per richieste successive con esattamente la stessa Acceptintestazione .

Ora questo è importante solo se la pagina è memorizzabile nella cache in primo luogo. Per impostazione predefinita, le pagine PHP non lo sono. Una pagina PHP può contrassegnare l'output come memorizzabile nella cache inviando determinate intestazioni ( Expires, ad esempio). Ma se e come farlo è una domanda diversa.


è "potrebbe ottenere" o è "dovrebbe ottenere"?
Pacerier

6
@Pacerier "might get" è corretto. Vary: Acceptnon significa che ogni singolo Acceptvalore di intestazione distinto possibile produce una risposta diversa e unica. Significa solo che Acceptun'intestazione diversa potrebbe produrre una risposta diversa.
Jason Orendorff


2

In realtà ci sono un numero significativo di nuove funzionalità in arrivo (e già in Chrome) che rendono l' Varyintestazione estremamente utile. Ad esempio, considera il suggerimento del cliente . Quando viene utilizzato in connessione con le immagini, ad esempio, il suggerimento del client consente a un server di ottimizzare le risorse come le immagini a seconda di:

  • Larghezza dell'immagine
  • Larghezza finestra
  • Tipo di codifica supportato dal browser (pensa WebP)
  • Downlink (essenzialmente velocità di rete)

Quindi un server che supporta queste funzionalità imposterà l' Varyintestazione per indicarlo.

Chrome pubblicizza il supporto WebP impostando "image / webp" come parte Varydell'intestazione per ogni richiesta. Quindi un server potrebbe riscrivere un'immagine come WebP se il browser la supporta, quindi il proxy dovrebbe controllare l'intestazione in modo da non memorizzare nella cache un'immagine WebP e quindi servirla a un browser che non supporta WebP. Ovviamente, se il tuo server non lo fa, non avrebbe importanza. Quindi, poiché la risposta del server varia sull'intestazione della Acceptrichiesta, la risposta deve includere quello per non confondere i proxy:

Vary: Accept

Un altro esempio potrebbe essere la larghezza dell'immagine. Su un browser mobile l' Widthintestazione potrebbe essere piuttosto piccola per un'immagine reattiva, rispetto a quello che sarebbe se visualizzata da un browser desktop. Quindi in quel caso Widthverrebbe aggiunto Varyall'header: è essenziale che il proxy non memorizzi nella cache la piccola versione mobile e la serva ai browser desktop, o viceversa. In tal caso, l'intestazione potrebbe includere:

Vary: Accept, Width

O nel caso in cui un server supportasse tutte le specifiche di suggerimento del client, l'intestazione sarebbe qualcosa del tipo:

Vary: Accept, DPR, Width, Save-Data, Downlink
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.