Como HTTP caches de proxy decidir entre servindo Identidade- vs. recursos gzip-codificado?
-
22-08-2019 - |
Pergunta
Um servidor HTTP usa conteúdo de negociação para servir um único Identidade- URL ou codificada em gzip com base no cabeçalho da Accept-Encoding
do cliente.
Agora, dizer que temos um proxy cache como lulas entre clientes e o httpd.
Se o proxy tem em cache ambas codificações de uma URL, como se determinar qual a servir?
A instância não-gzip (não servia originalmente com Vary
) pode ser servido a qualquer cliente, mas as instâncias codificadas (tendo Vary: Accept-Encoding
) só pode ser enviado a um cliente com o valor do cabeçalho Accept-Encoding
idêntica como foi usado na solicitação original .
por exemplo. Opera envia "deflate, gzip, x-gzip, identity, *;q=0"
mas IE8 envia "gzip, deflate"
. De acordo com a especificação, em seguida, caches não devem compartilhar caches codificado de conteúdo entre os dois navegadores. Isso é verdade?
Solução
Em primeiro lugar, é IMHO incorreta não enviar "Vary: Accept-Encoding". Quando a entidade varia de fato por esse cabeçalho (ou sua ausência)
Dito isto, a especificação atualmente na verdade não permite servir a resposta em cache para Opera, porque o cabeçalho Vary não corresponde acordo com as definições em HTTPbis, Parte 6, Seção 2.6 . Talvez esta é uma área onde devemos relaxar os requisitos para caches (você pode querer acompanhar o IETF HTTP mailing list ...
UPDATE: Acontece que este já estava marcado como uma questão em aberto; Acabei de adicionar um problema em nosso issue tracker para isto, veja Issue 147 .
Outras dicas
Julian é certo, é claro. Lição:. Sempre enviar Vary: Accept-Encoding
quando sniffing Accept-Encoding
, não importa o que a codificação resposta ??p>
Para responder a minha pergunta, se você deixar erroneamente Vary
fora, se um proxy recebe uma resposta não codificado (sem Vary
), ele pode simplesmente cache e retornar isso para cada solicitação subseqüente (ignorando Accept-Encoding
). Squid faz isso .
O grande problema com deixando de fora Vary é que, se o cache recebe uma variante codificada sem Vary, em seguida, ele pode enviar este em resposta a outras solicitações mesmo que a sua Accept-Encoding indica o cliente não pode compreender o conteúdo.