Como "304 não modificado" funciona exatamente?

174
  • Como são geradas as respostas "304 não modificadas"?

  • Como um navegador determina se a resposta a uma solicitação HTTP é 304?

  • É definido pelo navegador ou enviado do servidor?

  • Se enviado pelo servidor, como o servidor conhece os dados disponíveis no cache, também como define 304 como uma imagem?

Meu palpite, se é gerado pelo navegador:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Estou confiando em um provedor de API de terceiros para obter dados, analisar e enviá-los para o meu banco de dados. Os dados podem ou não mudar durante cada solicitação, mas o cabeçalho sempre envia 200. Eu não quero analisar, verificar o último ID exclusivo no banco de dados e assim por diante ... para determinar a alteração nos dados, nem comparar o resultado diretamente md5(), sha1()e sim , crc32()misturar o resultado e funcionar bem, mas estou pensando sobre o algoritmo para determinar 304.

Eu quero usar o mesmo tipo de algoritmo para determinar a alteração nos meus dados.

VenomVendor
fonte
2
Sim, pesquisei como o 304 não modificado funciona , mas não obtive resposta.
VenomVendor
1
Você precisa ser um pouco mais geral. google.com/search?q=http%20caching
SLaks

Respostas:

200

Quando o navegador coloca algo em seu cache, ele também armazena o cabeçalho Last-Modifiedou ETagdo servidor.

O navegador envia uma solicitação com o cabeçalho If-Modified-Sinceou If-None-Match, dizendo ao servidor para enviar um 304 se o conteúdo ainda tiver essa data ou ETag.

O servidor precisa de alguma maneira de calcular uma data modificada ou ETag para cada versão de cada recurso; isso geralmente vem do sistema de arquivos ou de uma coluna separada do banco de dados.

SLaks
fonte
1
ETagé a palavra-chave, verificado com cabeçalhos ETagpermanece mesmo em ambos Response Headerse Response Headers From Cache, você pode dizer o por trás algoritmo ETag. Atualizei minha pergunta afirmando minha exigência.
VenomVendor
4
@VenomVendor: ETagé apenas um campo em que o servidor pode armazenar um ID exclusivo (normalmente um número de hash ou versão ou relógio de vetor). Isso não ajuda a calcular esse ID; isso depende do seu código do servidor.
SLaks
@ Slaks: O que acontece se a página tiver uma chamada de banco de dados ... Há uma chance de os dados no banco de dados terem mudado .. Nesse caso, não faz sentido verificar a chamada da última modificação, Correta ?. .Como é que essa condição é analisada?
User1050619
3
@ user1050619: Cabe ao seu servidor garantir que a ETag seja precisa. Se você mostrar dados de um banco de dados, precisará incluir isso.
SLaks
Uma coisa que ainda não está clara é se, se você possui um grande max-age, o navegador precisa fazer a solicitação? (como poderia ser stub em 304 e nem fazer a solicitação) ... você deseja isso, por exemplo, com recursos "com impressão digital" (eles são bons para sempre). Doutra maneira, que é o ponto de max-age...
Andy Hayden
19

Última modificação: a data da última modificação do objeto solicitado

If-Modified-Since: Permite que 304 não seja devolvido se a data da última modificação não for alterada.

ETag: um ETag é um identificador opaco atribuído por um servidor da web a uma versão específica de um recurso encontrado em uma URL. Se a representação do recurso nesse URL mudar, um ETag novo e diferente será designado.

If-None-Match: Permite que um 304 não modificado seja retornado se ETag não for alterado.

o cache de armazenamento do navegador com uma data (última modificação) ou ID (ETag); quando você precisar solicitar o URL novamente, o navegador enviará uma mensagem de solicitação com o cabeçalho:

insira a descrição da imagem aqui

o servidor retornará 304 quando a instrução if for False e o navegador usará o cache.

宏杰 李
fonte