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.
fonte
Respostas:
Quando o navegador coloca algo em seu cache, ele também armazena o cabeçalho
Last-Modified
ouETag
do servidor.O navegador envia uma solicitação com o cabeçalho
If-Modified-Since
ouIf-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.
fonte
ETag
é a palavra-chave, verificado com cabeçalhosETag
permanece mesmo em ambosResponse Headers
eResponse Headers From Cache
, você pode dizer o por trás algoritmoETag
. Atualizei minha pergunta afirmando minha exigência.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.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 demax-age
...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:
o servidor retornará 304 quando a instrução if for False e o navegador usará o cache.
fonte