Eu uso PHP para gerar páginas da Web dinâmicas. Conforme declarado no tutorial a seguir (veja o link abaixo), o tipo MIME de documentos XHTML deve ser "application / xhtml + xml" quando $ _SERVER ['HTTP_ACCEPT'] permitir. Uma vez que você pode servir a mesma página com 2 MIMEs diferentes ("application / xhtml + xml" e "text / html"), você deve definir o cabeçalho HTTP "Vary" para "Aceitar". Isso ajudará o cache em proxies.
Link: http://keystonewebsites.com/articles/mime_type.php
Agora eu não tenho certeza da implicação de: header ('Vary: Accept'); Não tenho certeza do que 'Vary: Aceitar' fará exatamente ...
A única explicação que encontrei é:
Após o cabeçalho Content-Type, um cabeçalho Vary é enviado para (se bem entendi) dizer aos caches intermediários, como servidores proxy, que o tipo de conteúdo do documento varia dependendo das capacidades do cliente que solicita o documento. http://www.456bereastreet.com/archive/200408/content_negotiation/
Qualquer um pode me dar uma explicação "real" deste cabeçalho ( com aquele valor ). Acho que entendo coisas como: Vary: Accept-Encoding em que o cache em proxies pode ser baseado na codificação da página veiculada, mas não entendo: Vary: Accept
Vary:
cabeçalho.Respostas:
O
cache-control
cabeçalho é o principal mecanismo de um servidor HTTP para informar a um proxy de armazenamento em cache a "atualização" de uma resposta. (ou seja, como / se tempo para armazenar a resposta no cache)Em algumas situações, as
cache-control
diretivas são insuficientes. Uma discussão do grupo de trabalho HTTP está arquivada aqui, descrevendo uma página que muda apenas com o idioma. Este não é o caso de uso correto para o cabeçalho vary, mas o contexto é valioso para nossa discussão. (Embora eu acredite que o cabeçalho Vary resolveria o problema nesse caso, existe uma maneira melhor.) Nessa página:Um exemplo inventado:
Seu servidor HTTP tem uma grande página de destino. Você tem duas páginas ligeiramente diferentes com o mesmo URL, dependendo se o usuário já esteve lá antes. Você distingue entre solicitações e "contagem de visitas" de um usuário com base em Cookies. Mas, como a página de destino do seu servidor é muito grande, você deseja que os proxies intermediários armazenem a resposta em cache, se possível.
Os cabeçalhos URL, Last-Modified e Cache-Control são insuficientes para fornecer esse insight a um proxy de armazenamento em cache, mas se você adicionar
Vary: Cookie
, o mecanismo de cache adicionará o cabeçalho Cookie em suas decisões de armazenamento em cache.Finalmente, para sites dinâmicos e de pequeno tráfego - sempre achei o simples
Cache-Control: no-cache, no-store
ePragma: no-cache
suficiente.Editar - para responder mais precisamente à sua pergunta: o cabeçalho da solicitação HTTP 'Aceitar' define os Tipos de Conteúdo que um cliente pode processar. Se você tiver duas cópias do mesmo conteúdo na mesma URL, diferindo apenas no tipo de conteúdo, o uso
Vary: Accept
pode ser apropriado.Atualização 11 de setembro de 12:
Estou incluindo alguns links que apareceram nos comentários desde que este foi publicado originalmente. Ambos são recursos excelentes para exemplos do mundo real (e problemas) com Vary: Accept; Se estiver lendo esta resposta, você também precisa ler esses links.
O primeiro, do excelente EricLaw, sobre o comportamento do Internet Explorer com o cabeçalho Vary e alguns dos desafios que ele apresenta aos desenvolvedores: o cabeçalho Vary impede o cache no IE . Resumindo, o IE (pré-IE9) não armazena em cache nenhum conteúdo que use o cabeçalho Vary porque o cache de solicitação não inclui cabeçalhos de solicitação HTTP. EricLaw (Eric Lawrence no mundo real) é gerente de programa da equipe do IE.
A segunda é de Eran Medan e é uma discussão contínua sobre o comportamento inesperado relacionado a Vary no Chrome: o backing não manipula o cabeçalho Vary corretamente . Está relacionado ao comportamento do IE, exceto que os desenvolvedores do Chrome adotaram uma abordagem diferente - embora não pareça ter sido uma escolha deliberada.
fonte
Vary: Accept
simplesmente diz que a resposta foi gerada com base noAccept
cabeçalho da solicitação. Uma solicitação com umAccept
cabeçalho diferente pode obter uma resposta diferente.(Você pode ver que o código PHP vinculado olha
$HTTP_ACCEPT
. Esse é o valor doAccept
cabeçalho da solicitação.)Para caches HTTP, isso significa que a resposta deve ser armazenada em cache com cuidado extra. Só vai ser uma correspondência válida para solicitações posteriores com exatamente o mesmo
Accept
cabeçalho .Agora, isso só importa se a página puder ser armazenada em cache em primeiro lugar. Por padrão, as páginas PHP não são. Uma página PHP pode marcar a saída como armazenável em cache, enviando certos cabeçalhos (
Expires
por exemplo). Mas se e como fazer isso é uma questão diferente.fonte
Vary: Accept
não significa que cadaAccept
valor de cabeçalho distinto possível produz uma resposta diferente e única. Significa apenas que umAccept
cabeçalho diferente pode produzir uma resposta diferente.Este vídeo do Google para webmaster tem uma explicação muito boa sobre o
Vary
cabeçalho HTTP .fonte
Na verdade, há um número significativo de novos recursos em breve (e já no Chrome) que tornam o
Vary
cabeçalho extremamente útil. Por exemplo, considere a sugestão do cliente . Quando usado em conexão com imagens, por exemplo, a sugestão de cliente permite que um servidor otimize recursos, como imagens, dependendo de:Portanto, um servidor que oferece suporte a esses recursos definiria o
Vary
cabeçalho para indicar isso.O Chrome anuncia o suporte WebP definindo "image / webp" como parte do
Vary
cabeçalho de cada solicitação. Portanto, um servidor pode reescrever uma imagem como WebP se o navegador oferecer suporte, então o proxy precisará verificar o cabeçalho para não armazenar em cache uma imagem WebP e, em seguida, veiculá-la em um navegador que não ofereça suporte a WebP. Obviamente, se o seu servidor não fizer isso, não importa. Portanto, como a resposta do servidor varia noAccept
cabeçalho da solicitação, a resposta deve incluir isso para não confundir os proxies:Outro exemplo pode ser a largura da imagem. Em um navegador móvel, o
Width
cabeçalho pode ser bem pequeno para uma imagem responsiva, em comparação com o que seria se visualizado em um navegador de desktop. Portanto, nesse casoWidth
seria adicionado aoVary
cabeçalho é essencial para o proxy não armazenar em cache a versão móvel pequena e veiculá-la em navegadores de desktop, ou vice-versa. Nesse caso, o cabeçalho pode incluir:Ou, no caso de um servidor suportar todas as especificações de dicas do cliente, o cabeçalho seria algo como:
fonte