Qual é a diferença entre o código de status HTTP 200 (cache) e o código de status 304?

201

Estou usando o plug-in "Velocidade da página" do Google para o Firefox para acessar meu site.

Alguns dos componentes da minha página são indicados como status HTTP:

200 200 (cache) 304

Pelo "Page Speed" do Google.

O que me deixa confuso é a diferença entre 200 (cache) e 304.

Atualizei a página várias vezes (mas não limpei meu cache) e sempre parece que meu favicon.ico e algumas imagens têm status = 200 (cache) enquanto outras imagens têm status http 304.

Eu não entendo por que a diferença.

ATUALIZAÇÃO :

Usando o Google "Page Speed", recebo um "200 (cache)" para http://example.com/favicon.ico e http://cdn.example.com/js/ga.js

Porém, recebo o status http "304" em http://cdn.example.com/js/combined.min.js

Não entendo por que tenho dois arquivos JavaScript localizados no mesmo diretório / js /, um retornando um status http 304 e o outro retornando um código de status 200 (cache).

Hank
fonte

Respostas:

220

Os itens com o código "200 (cache)" foram atendidos diretamente do cache do navegador, o que significa que as solicitações originais dos itens foram retornadas com cabeçalhos, indicando que o navegador poderia armazená-los em cache (por exemplo, datas Expiresou Cache-Control: max-agecabeçalhos futuros ) e Quando você acionou a nova solicitação, esses objetos em cache ainda estavam armazenados no cache local e ainda não haviam expirado.

304, por outro lado, é a resposta do servidor após o navegador verificar se um arquivo foi modificado desde a última versão em cache (a resposta é "não").

Para obter o melhor desempenho da Web, é melhor definir um futuro Expires:ou Cache-Control: max-agecabeçalho para todos os ativos e, em seguida, quando um ativo precisar ser alterado, alterar o nome do arquivo real do recurso ou anexar uma sequência de versões às solicitações desse ativo. Isso elimina a necessidade de qualquer solicitação a ser feita, a menos que o ativo tenha sido definitivamente alterado da versão no cache (não há necessidade dessa resposta 304). O Google tem mais detalhes sobre o uso correto do cache de longo prazo .

Ben Regenspan
fonte
2
Então, o que é melhor ter de uma perspectiva de velocidade ... "200 (cache)" ou "304" mensagens de status http?
Hank
22
200 cache. Algumas boas notas sobre isso aqui: developer.yahoo.com/performance/rules.html#expires . Você deseja o máximo de tempo de expiração possível em seus ativos, mas precisa equilibrar isso com o fato de perder uma certa quantidade de controle dessa maneira. Uma coisa que você pode fazer é definir vencimentos duradouros nos arquivos e, quando necessário, incrementar um número de versão do ativo para esses arquivos. Por exemplo, você pode incluir style.css? V1 e incrementar o elemento <link> para style.css? V2 quando houver alterações.
11119 Ben Regenspan
1
Justiça, então por que o Firebug relata que o ga.js é extraído do cache local (status = 200 cache) enquanto o combinado.min.js está relatando um status 304 http. O estranho é que ambos os arquivos são do mesmo tipo de arquivo (JavaScript) e residem no mesmo diretório do servidor. Você pensaria tanto seria ou 200 ou 304, e não diferente
Hank
8
Os cabeçalhos max-agee agecombinados também podem resultar em 200 resultados (cache) se agefor menor que max-age. A única exceção é quando o usuário clica no botão de atualização do navegador; nesse caso, um cabeçalho 304 é enviado.
yitwail
2
HTML5 Boilerplate recomenda contra utilizando o método de string de consulta de cache-rebentando - é melhor para mudar a href, url,e srcreferências a cada arquivo para incluir uma 'impressão digital' (um hash do arquivo ou um número incrementado simples), e depois dizer ao servidor retirar essa impressão digital e apenas servir style.cssou o que quer. Se você não puder fazer isso no servidor, faça com que seu sistema de criação renomeie os arquivos reais com a impressão digital.
iono
62

200 (cache) significa que o Firefox está simplesmente usando a versão em cache localmente. Este é o mais rápido porque não é feita nenhuma solicitação ao servidor da Web.

304 significa que o Firefox está enviando uma solicitação condicional "If-Modified-Since" para o servidor Web. Se o arquivo não tiver sido atualizado desde a data de envio pelo navegador, o servidor da Web retornará uma resposta 304 que basicamente instrui o Firefox a usar sua versão em cache. Não é tão rápido quanto 200 (cache) porque a solicitação ainda é enviada ao servidor da Web, mas o servidor não precisa enviar o conteúdo do arquivo.

Para sua última pergunta, não sei por que os dois arquivos JavaScript no mesmo diretório estão retornando resultados diferentes.

James Lawruk
fonte
18

Isso me jogou por um longo tempo também. A primeira coisa que eu verificaria é que você não está recarregando a página clicando no botão Atualizar, que sempre emitirá uma solicitação condicional de recursos e retornará 304s para muitos dos elementos da página. Em vez disso, vá até a barra de URL, selecione a página e pressione Enter como se você tivesse digitado o mesmo URL novamente, o que lhe dará um melhor indicador do que está sendo armazenado em cache corretamente. Este artigo faz um ótimo trabalho explicando a diferença entre solicitações condicionais e incondicionais e como o botão de atualização as afeta: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- condicional-http-pedidos-e-a-atualização-button.aspx

Pooch
fonte
1
Não consigo nem descrever quanto tempo gastei tentando descobrir o status de 304 solicitações à CDN. Embora você responder a uma pergunta pouco diferente, você merece uma recompensa :-)
Peeech
Você está certo: a diferença nos códigos está relacionada ao fato de você estar recarregando ou não a mesma página. Se eu recarregar uma página, vejo no monitor de rede do navegador um código 304. Mas, se eu acessar outro URL, que usa esses mesmos arquivos, vejo no monitor de rede do navegador um código 200 (do cache). No meu caso, o outro URL era apenas uma string de consulta anexada ao URL original (a página era essencialmente o mesmo).
Aldemarcalazans
8

HTTP 304 "não foi modificado". Seu servidor da web basicamente diz ao navegador "esse arquivo não foi alterado desde a última vez em que você o solicitou". Enquanto um HTTP 200 está dizendo ao navegador "aqui está uma resposta bem-sucedida" - que deve ser retornada quando for a primeira vez que seu navegador estiver acessando o arquivo ou a primeira vez que uma cópia modificada estiver sendo acessada.

Para mais informações sobre códigos de status, consulte http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .

Richleland
fonte
Esse é o meu entendimento também ... e foi por isso que afirmei no meu post original que atualizei minha página várias vezes e ainda estou recebendo o "200 (cache)" para o mesmo favicon.ico e o JavaScript específico que tenho. Muito estranho
Hank
2
200, na verdade, não significa armazenado em cache, apenas significa OK. As chances são de que a configuração do servidor não diz explicitamente o navegador para armazenar em cache o seu ico e arquivos js, o que tornaria retornar um código de status de 200.
richleland
Esse não é o caso porque em alguns dos meus JavaScript, recebo um 304 e em outro JavaScript recebo um "200 (cache)". Todos JavaScript reside dentro da mesma example.com/js/ diretório do servidor web
Hank
Devo acrescentar que 200 (cache) significa apenas que é armazenado em cache localmente e não está realmente fazendo uma solicitação ao servidor, o que será mais rápido do que acessar o servidor e obter uma resposta 304.
richleland
Atualizei minha postagem original para mostrar meu site ativo e o JavaScript em questão. Por favor, veja minha postagem original atualizada.
Hank
2

Para sua última pergunta, por quê? Vou tentar explicar com o que sei

Uma breve explicação desses três códigos de status em termos leigos.

  • 200 - sucesso (solicitações do navegador e obter arquivos do servidor)

Se o armazenamento em cache estiver ativado no servidor

  • 200 (do cache de memória) - arquivo encontrado no navegador, para que o navegador não seja solicitado pelo servidor
  • 304 - o navegador solicita um arquivo, mas ele é rejeitado pelo servidor

Para alguns arquivos, o navegador está decidindo solicitar do servidor e, para alguns, está lendo os arquivos armazenados (armazenados em cache). Por que é isso ? Todos os arquivos têm uma data de validade, então

Se um arquivo não expirar, o navegador usará do cache (200 cache).

Se o arquivo expirar, o navegador solicitará o servidor para um arquivo. Arquivo de verificação do servidor nos dois locais (navegador e servidor). Se o mesmo arquivo for encontrado, o servidor recusará a solicitação. Conforme o navegador de protocolo, usa o arquivo existente.

olhe para esta configuração nginx

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Aqui a expiração é definida como 60 segundos, para que todos os arquivos estáticos sejam armazenados em cache por 60 segundos. Portanto, se você solicitar um arquivo novamente dentro de 60 segundos, o navegador lerá da memória (200 de memória). Se você solicitar após 60 segundos, o navegador solicitará o servidor (304).

Supus que o arquivo não fosse alterado após 60 segundos; nesse caso, você obteria 200 (ou seja, o arquivo atualizado será buscado no servidor).

Portanto, se os servidores estiverem configurados com diferentes cabeçalhos (políticas) de vencimento e armazenamento em cache, o status poderá ser diferente.

No seu caso, você está usando o cdn, o principal objetivo do cdn é a alta disponibilidade e a entrega rápida. Portanto, eles usam vários servidores. Embora pareça que os arquivos estejam no mesmo diretório, o cdn pode usar vários servidores para fornecer conteúdo, se esses servidores tiverem configurações diferentes. Então esses status podem mudar. Espero que ajude.

Saahithyan Vigneswaran
fonte
O 304 - Não Modificado não é uma "rejeição" pelo servidor. É o servidor que declara ao cliente "a versão que você está solicitando, eu sei que não foi modificada, você realmente não precisa do arquivo". Tecnicamente, 304 é um dos códigos de resposta "redirecionamento". É dizer ao cliente "obtenha do seu próprio cache".
22419 Bob Kuhar