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:

  1. 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.
  2. 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 ou If-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!