Entendendo a Resposta 304 Not Modified
no Cache HTTP
Ao desenvolver aplicações web, o manejo eficiente de recursos é crucial para o desempenho, especialmente no que diz respeito ao acesso a arquivos e ao cache do navegador. Uma maneira de otimizar esse processo é utilizando corretamente a resposta HTTP 304 Not Modified
. Essa resposta informa ao navegador que o recurso solicitado não mudou desde a última vez que foi recuperado, permitindo que o navegador continue usando sua versão em cache em vez de fazer o download novamente. Mas como saber quando enviar essa resposta? Vamos detalhar passo a passo.
Principais Cabeçalhos HTTP a Verificar
Para determinar se deve enviar uma resposta 304 Not Modified
, você precisa verificar cabeçalhos HTTP específicos enviados pelo navegador do cliente. Os dois principais cabeçalhos em que se concentrar são:
- Etag: Este cabeçalho serve como um identificador único para um recurso em uma versão específica. O navegador compara seu Etag em cache com o Etag do servidor para ver se eles coincidem.
- If-None-Match: Este cabeçalho é enviado pelo navegador e contém o valor do Etag em cache. Se o recurso não mudou, o servidor pode responder com
304
.
O Que Observar
- Se o Etag do navegador existe: Se o navegador incluir os cabeçalhos
Etag
ouIf-None-Match
na solicitação, isso indica que ele possui uma versão em cache do recurso anteriormente. - Considerações sobre aspas: Os navegadores às vezes colocam aspas ao redor do valor do Etag. Certifique-se de remover essas aspas antes da comparação.
Cabeçalhos Necessários para a Resposta Inicial
Ao enviar inicialmente o recurso (normalmente com uma resposta 200 OK
), é essencial incluir cabeçalhos relevantes que informem ao navegador sobre o estado do recurso:
- Last-Modified: Indica a última vez que o recurso foi alterado. Isso pode ser um verificador alternativo para a validação do cache ao lado do Etag.
- Etag (como mencionado antes): Este deve ser gerado para o recurso e incluído nos cabeçalhos de resposta para facilitar a validação futura do cache.
Implementando a Lógica
Aqui está um exemplo simplificado em pseudocódigo que demonstra como implementar a lógica para enviar uma resposta 304 Not Modified
:
server_etag = gen_etag_for_this_file(meuarquivo)
etag_from_browser = get_header("Etag")
if etag_from_browser não existe:
etag_from_browser = get_header("If-None-Match")
if o navegador colocou aspas no etag:
remover as aspas (por exemplo, "foo" --> foo)
set server_etag no cabeçalho http
if etag_from_browser combina com server_etag
enviar código de retorno 304 para o navegador
Exemplo de Trecho de Lógica do Servidor
Aqui está como você poderia implementar isso na lógica do seu servidor:
/* o cliente deve definir Etag ou If-None-Match */
mketag(etag, &sb);
etagin = apr_table_get(r->headers_in, "Etag");
if (etagin == NULL)
etagin = apr_table_get(r->headers_in, "If-None-Match");
if (etag != NULL && etag[0] == '"') {
/* Remove as aspas, se presentes */
int sl;
sl = strlen(etag);
memmove(etag, etag+1, sl+1);
etag[sl-2] = 0;
}
apr_table_add(r->headers_out, "ETag", etag);
if (etagin != NULL && strcmp(etagin, etag) == 0) {
/* Se o etag combina, retorna um status 304 */
rc = HTTP_NOT_MODIFIED;
}
Considerações Finais
Ao saber como e quando enviar uma resposta 304 Not Modified
, você pode efetivamente reduzir a carga no servidor e melhorar a experiência do usuário. Não se esqueça da importância de incluir os cabeçalhos Etag
e Last-Modified
durante a resposta inicial para permitir que o cliente faça requisições precisas de validação de cache posteriormente. Se você tiver perguntas sobre a geração de Etag ou precisar de mais ajuda na implementação, sinta-se à vontade para entrar em contato para exemplos mais detalhados. Boa codificação!