2009-12-29 13 views
82

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

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

Ora io non sono sicuro della implicazione di: intestazione ('Vary: Accept'); Io non sono davvero sicuro di cio 'Vary: Accept' sarà proprio fare ...

L'unica spiegazione che ho trovato è:

Dopo l'header Content-Type, una Vary intestazione viene inviato a (se ho capito bene ) indicare alle cache intermedie, come server proxy, , che il tipo di documento varia a seconda dello sulle capacità del client che richiede il documento. http://www.456bereastreet.com/archive/200408/content_negotiation/

Qualcuno mi può dare una spiegazione "reale" di questa intestazione (con quel valore). Credo di capire le cose come: Vary: Accept-Encoding in cui la cache proxy potrebbe essere basato sulla codifica della pagina servito, ma non capisco: Vary: Accept

+1

Francamente - non si preoccupano . Lasciando da parte i difetti nell'implementazione su quel sito, l'unica volta in cui si ottengono benefici dal servire con un tipo di contenuto XML è quando si fanno cose che non possono essere fatte in text/html - e se tutto ciò che si sta facendo sta cambiando Doctype e xmlns, quindi non farai queste cose. Attenersi a text/html. Del resto, potresti anche limitarti a HTML 4.01. – Quentin

+0

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

+2

Probabilmente dovresti leggere questo: http://blogs.msdn.com/ieinternals/archive/2009/06/17/Vary-Header-Prevents-Caching-in-IE.aspx prima di prendere in considerazione l'utilizzo di VARY. – EricLaw

risposta

85
  • Il cache-control header è il meccanismo principale per un server HTTP per dire a un proxy di caching la "freschezza" di una risposta. (vale a dire, se è lungo per memorizzare la risposta nella cache)

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

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

Un esempio inventato:

Il server HTTP ha una pagina di destinazione di grandi dimensioni. Hai due pagine leggermente diverse con lo stesso URL, a seconda che l'utente sia già stato lì. Distingui tra le richieste e il "conteggio delle visite" di un utente in base ai cookie.Ma, poiché la pagina di destinazione del server è così grande, si desidera che i proxy intermedi memorizzino la risposta nella cache, se possibile.

Le intestazioni URL, Last-Modified e Cache-Control non sono sufficienti per fornire questo dettaglio a un proxy di memorizzazione nella cache, ma se si aggiunge Vary: Cookie, il motore della cache aggiungerà l'intestazione del cookie alle sue decisioni di memorizzazione nella cache.

Infine, per il traffico di piccole dimensioni, siti Web dinamici: ho sempre trovato sufficiente il semplice Cache-Control: no-cache, no-store e Pragma: no-cache.

Modifica - per rispondere in modo più preciso alla domanda: l'intestazione della richiesta HTTP "Accetta" definisce i tipi di contenuto che un client può elaborare. Se hai due copie dello stesso contenuto sullo stesso URL, differendo solo in Content-Type, allora potrebbe essere appropriato usare Vary: Accept.

Aggiornamento 11 Settembre 12:

sto tra cui un paio di link che sono apparse nei commenti dal momento che questo commento è stato originariamente pubblicato. Sono entrambe risorse eccellenti per esempi (e problemi) reali con Vary: Accept; Se stai leggendo questa risposta, devi leggere anche questi 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 Prevents Caching in IE. In breve, IE (pre IE9) non memorizza nella cache alcun contenuto che utilizza l'intestazione Vary poiché la cache della richiesta non include le intestazioni di richiesta HTTP. EricLaw (Eric Lawrence nel mondo reale) è un Program Manager del team di IE.

Il secondo è di Eran Medan, ed è una discussione in corso sul comportamento imprevisto relativo a Varia in Chrome: Backing doesn't handle Vary header correctly. È legato al comportamento di IE, tranne che gli sviluppatori di Chrome hanno adottato un approccio diverso, anche se non sembra essere stata una scelta deliberata.

+3

Attenzione a questo in congiunzione con il pulsante back browser in Chrome, c'è una sorta di guerra di fiamma su questo bug (che ora è wontfix per qualche motivo) http://code.google.com/p/chromium/issues/detail? id = 94369 –

+5

@EranMedan Il bug di Chrome è stato corretto. –

54

Vary: Accept dice semplicemente che la risposta è stata generata in base all'intestazione nella richiesta. Una richiesta con un'intestazione diversa potrebbe ottenere una risposta diversa.

(si può vedere che il codice PHP legato guarda $HTTP_ACCEPT. Questo è il valore dell'intestazione Accept richiesta.)

Per le cache HTTP, questo significa che la risposta deve essere memorizzato nella cache con cura supplementare. Sarà solo una corrispondenza valida per le richieste successive con la stessa intestazione Accept.

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.

+0

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

+6

@Pacerier "potrebbe ottenere" è corretto. 'Vary: Accept' non significa che ogni singolo possibile valore di intestazione' Accept' distinto produce una risposta diversa e unica. Significa solo che un'intestazione 'Accept' diversa * potrebbe * produrre una risposta diversa. –

2

Ci sono in realtà un numero significativo di nuove funzionalità in arrivo (e già in Chrome) che rendono estremamente utile l'intestazione Vary. Ad esempio, considerare Client Hinting.Quando utilizzato in collegamento con le immagini, ad esempio il client hinting consente a un server per ottimizzare le risorse come immagini a seconda:

  • Larghezza immagine
  • Finestra Larghezza
  • tipo di codifica supportati dal browser (si pensi WebP)
  • Downlink (essenzialmente la velocità della rete)

Quindi un server che supporta queste caratteristiche sarebbe impostare l'intestazione Vary per indicare che.

Chrome pubblicizza il supporto WebP impostando "image/webp" come parte dell'intestazione Vary per ogni richiesta. Quindi un server potrebbe riscrivere un'immagine come WebP se il browser lo supporta, quindi il proxy dovrebbe controllare l'intestazione in modo da non memorizzare nella cache un'immagine WebP e quindi servirla su un browser che non supporta WebP. Ovviamente, se il tuo server non lo fa, non importa. Quindi, dal momento la risposta del server varia sull'intestazione Accept richiesta, la risposta deve includere che in modo da non confondere i proxy:

Vary: Accept 

Un altro esempio potrebbe essere la larghezza dell'immagine. Su un browser mobile l'intestazione Width potrebbe essere piuttosto piccola per un'immagine reattiva, rispetto a quella che sarebbe se visualizzata da un browser desktop. Pertanto, in tal caso, l'Vary intestazione sarà aggiunta all'intestazione Vary per consentire al proxy di non memorizzare nella cache la versione per dispositivi mobili e di servirla nei browser desktop, o viceversa. In tal caso, l'intestazione potrebbe includono:

Vary: Accept, Width 

Oppure, nel caso in cui un server ha sostenuto tutti i client alludendo specifiche, l'intestazione sarebbe qualcosa di simile:

Vary: Accept, DPR, Width, Save-Data, Downlink 
Problemi correlati