304 Não Modificado

O que significa HTTP 304 Not Modified, por que é um código 3xx mas não um redirecionamento, como ETag e Last-Modified o conduzem e por que ele pode ajudar indiretamente a eficiência do rastreamento em sites grandes sem afetar os rankings.

Publicado pela primeira vez: 3 de jul. de 2026 · Última atualização: 6 de ago. de 2026 · Avançado
Idiomas
1 sinal de evidência nesta página

HTTP 304 Not Modified é a resposta a uma solicitação GET ou HEAD condicional cuja condição resulta falsa — uma solicitação que, de outra forma, teria recebido um 200. É uma resposta da classe 3xx que não é um redirecionamento — não tem cabeçalho Location e, pela especificação, não tem corpo algum. Um GET/HEAD que carrega If-None-Match (comparado a uma ETag) ou If-Modified-Since (comparado a Last-Modified) é o que torna uma solicitação condicional em primeiro lugar; uma segunda visita é o exemplo típico, não a regra do protocolo. Quando o validador ainda corresponde, o servidor responde 304 sem corpo e o cliente reutiliza sua cópia em cache. Para SEO, não há efeito direto no ranking — o Google já tem o conteúdo e um 304 apenas confirma que nada mudou, embora a Busca ainda possa recalcular os sinais de uma URL. O verdadeiro ganho é a economia de recursos: em sites grandes com muitas URLs que mudam raramente, 304s permitem que rastreadores evitem baixar novamente páginas inalteradas, economizando largura de banda e computação, algo que o Google diz que pode melhorar indiretamente a eficiência do rastreamento — ele não promete uma realocação automática do orçamento de rastreamento para outras URLs. O Google recomenda ETag como validador principal (ela não tem armadilhas de formatação de data), aceita definir os dois e considera uma mudança significativa o bastante para invalidar o cache somente quando o conteúdo realmente muda — não uma data de copyright no rodapé. Não confunda 304 com 301/302/307/308 (que movem você para uma URL diferente) nem com 204 No Content (também sem corpo, mas porque genuinamente não há nada a enviar).

TL;DR — 304 é a resposta a um GET/HEAD condicional cuja condição resulta falsa e que, de outra forma, teria recebido um 200 (RFC 9110 §15.4.5). Ele pertence à classe 3xx, mas não é um redirecionamento: não tem Location, não tem nova URL e — normativamente — não tem corpo (“it cannot contain content or trailers”). A condição é transportada por If-None-Match (contra uma ETag) e/ou If-Modified-Since (contra Last-Modified); se o validador ainda corresponder, o servidor retorna 304 e o cliente reutiliza o cache. Impacto em SEO: nenhum efeito direto no ranking — o Google já tem o conteúdo, embora a Busca ainda possa recalcular os sinais de uma URL — e uma economia de recursos em sites grandes (o Google diz que ela pode melhorar indiretamente a eficiência do rastreamento; não promete realocação automática do orçamento de rastreamento para outras URLs). A infraestrutura de rastreamento do Google aceita os dois validadores e recomenda ETag como principal (ela não tem armadilhas de formatação de data). Compare-o com 301/302/307/308 (que movem a URL) e com 204 (também sem corpo, mas porque genuinamente não há nada a enviar).

O que 304 significa na especificação

A RFC 9110 (HTTP Semantics) §15.4.5 define isso com precisão: “The 304 (Not Modified) status code indicates that a conditional GET or HEAD request has been received and would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false.” (tradução) «O código de status 304 (Not Modified) indica que uma solicitação GET ou HEAD condicional foi recebida e teria resultado em uma resposta 200 (OK) se não fosse pelo fato de a condição ter sido avaliada como falsa.» Esse é o gatilho normativo real — um GET/HEAD condicional cuja condição resulta falsa e que, de outra forma, teria recebido um 200. Em termos simples: o cliente pediu “entregue esta página, mas somente se ela tiver mudado”, o servidor determinou que ela não mudou e, portanto, deixa de enviar o corpo. Uma “segunda visita” é o exemplo cotidiano de como uma solicitação se torna condicional (o cliente anexa um validador salvo de uma resposta anterior), mas é um exemplo didático, não a regra — nada na especificação exige uma visita anterior, apenas uma solicitação condicional. Evidence for this claim RFC 9110 defines 304 Not Modified as the response to a conditional GET or HEAD when the selected representation has not changed and says the response cannot contain content. Scope: HTTP semantics for 304 conditional responses. Confidence: high · Verified: IETF: RFC 9110 §15.4.5 — 304 Not Modified

A especificação inclusive usa a palavra “redirecting” nesta seção — “the server is therefore redirecting the client to make use of that stored representation as if it were the content of a 200 (OK) response” (tradução) «portanto, o servidor está redirecionando o cliente para usar aquela representação armazenada como se fosse o conteúdo de uma resposta 200 (OK)» — mas leia com atenção: ele está redirecionando o cliente de volta para o próprio cache, não para outra URL. Não há cabeçalho Location nem novo endereço. Essa única frase é a origem da maior parte da confusão sobre se 304 “é um redirecionamento”. Não é, no sentido do HTTP.

Dois outros pontos normativos importam:

  • Nunca há corpo. A RFC 9110 diz: “A 304 response is terminated by the end of the header section; it cannot contain content or trailers.” (tradução) «Uma resposta 304 termina no fim da seção de cabeçalhos; não pode conter conteúdo nem trailers.» Um 304 que envia um corpo viola a especificação, e alguns clientes podem tratá-lo incorretamente. Esta é uma regra rígida, não uma preferência de estilo.
  • Ele carrega os mesmos metadados que um 200 carregaria. O servidor “MUST generate any of the following header fields that would have been sent in a 200 (OK) response to the same request: Content-Location, Date, ETag, and Vary,” (tradução) «DEVE gerar todos os seguintes campos de cabeçalho que teriam sido enviados em uma resposta 200 (OK) à mesma solicitação: Content-Location, Date, ETag e Vary», além de Cache-Control e Expires quando aplicável. Assim, um 304 contém os cabeçalhos do 200 sem a carga útil.
Evidence for this claim A 304 response terminates after the header section and cannot contain content or trailers. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified

Como 304 realmente funciona: solicitações condicionais

Um servidor nunca envia um 304 do nada. Ele sempre é uma resposta a uma solicitação condicional — uma solicitação que o cliente torna condicional anexando um validador salvo de uma resposta anterior. Existem dois validadores.

ETag e If-None-Match

Uma ETag (entity tag) é um token opaco que o servidor anexa a uma resposta 200 — pense nele como uma impressão digital de versão daquela representação exata da URL. Na próxima solicitação para essa URL, o cliente envia o valor salvo de volta em um cabeçalho If-None-Match. O servidor compara: se a ETag atual ainda corresponder, nada mudou, então ele retorna 304; se for diferente, retorna um 200 novo com o conteúdo atualizado e uma nova ETag.

Last-Modified e If-Modified-Since

A alternativa baseada em data: o servidor envia um registro de data e hora Last-Modified no 200. Na próxima vez, o cliente o envia de volta em um cabeçalho If-Modified-Since, e o servidor compara as datas — se o recurso não mudou desde aquele momento, é um 304. Isso é mais simples, mas mais grosseiro (tão granular quanto o registro de data e hora) e sensível à formatação exata da data HTTP, uma fonte comum de bugs. Quando os dois validadores estão presentes, If-None-Match (a ETag) tem precedência sobre If-Modified-Since.

ETags fortes versus fracas

Uma ETag pode ser forte ou fraca, e a diferença importa. Segundo a orientação da MDN sobre solicitações condicionais, “strong validation consists of guaranteeing that the resource is, byte to byte, identical to the one it is compared to.” (tradução) «a validação forte consiste em garantir que o recurso é idêntico, byte a byte, àquele com o qual é comparado.» Uma ETag fraca recebe o prefixo W/ (por exemplo, ETag: W/"abc123") e afirma apenas uma equivalência semântica — o exemplo da MDN é que “a page that would differ from another only by a different date in its footer, or different advertising, would be considered identical to the other with weak validation.” (tradução) «uma página que diferisse de outra apenas por uma data diferente no rodapé ou por publicidade diferente seria considerada idêntica à outra com validação fraca.» ETags fortes (sem prefixo) são necessárias para coisas como solicitações de intervalo que exigem correspondência exata de bytes; ETags fracas são úteis quando compactação, espaços em branco ou diferenças triviais não substanciais não deveriam forçar uma nova busca completa. A armadilha prática: se sua ETag muda sempre que o conteúdo é recomprimido com gzip/Brotli, ou varia entre servidores balanceados, você provocará novos rastreamentos desnecessários — escolha forte ou fraca deliberadamente e mantenha o valor estável para conteúdo genuinamente inalterado.

O handshake completo, passo a passo

  1. Primeira solicitação → o servidor retorna 200 OK com o conteúdo, além de ETag e/ou Last-Modified.
  2. O cliente armazena o conteúdo e esses validadores.
  3. Próxima solicitação → o cliente envia If-None-Match e/ou If-Modified-Since com os valores armazenados.
  4. O servidor decide: inalterado → 304 Not Modified, sem corpo; o cliente reutiliza o cache; alterado → 200 OK com o novo corpo e validadores recentes. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation

Se você quer o tratamento mais profundo de cache e validadores como alavanca de eficiência de rastreamento — toda a história das solicitações condicionais e sua relação com o orçamento de rastreamento — esse é um tema complementar; este artigo é a visão focada no código de status.

304 e SEO: nenhum efeito no ranking, efeito real na eficiência do rastreamento

Essa é toda a história de SEO, e ela é mais limitada do que muitos textos genéricos de blog sugerem. 304 não tem efeito direto no ranking, e a orientação do próprio Google sobre como códigos de status afetam rastreamento e indexação também limita o efeito sobre a indexação: a Busca ainda pode recalcular os sinais de uma URL, mas, fora isso, um 304 não muda como a página é indexada. O Google já tem o conteúdo do rastreamento anterior; um 304 apenas confirma que nada mudou, então ele continua usando o que possui. Não existe bônus de ranking por retornar 304s.

O que 304 realmente oferece é economia de recursos que pode melhorar indiretamente a eficiência do rastreamento. Na publicação da Central da Pesquisa Google de dezembro de 2024 sobre cache HTTP, Gary Illyes explicou de forma direta: “Especially if you have a large site with rarely-changing content under individual URLs, allowing caching locally may help your site be crawled more efficiently. Google’s crawling infrastructure supports heuristic HTTP caching as defined by the HTTP caching standard, specifically through the ETag response- and If-None-Match request header, and the Last-Modified response- and If-Modified-Since request header.” (tradução) «Especialmente se você tem um site grande com conteúdo que muda raramente em URLs individuais, permitir o cache local pode ajudar seu site a ser rastreado com mais eficiência. A infraestrutura de rastreamento do Google aceita o cache HTTP heurístico definido pelo padrão de cache HTTP, especificamente por meio do cabeçalho de resposta ETag e do cabeçalho de solicitação If-None-Match, e do cabeçalho de resposta Last-Modified e do cabeçalho de solicitação If-Modified-Since.»

Sobre o mecanismo exato do 304, a mesma publicação é explícita sobre por que o corpo vazio é o ponto: se a ETag enviada pelo rastreador “matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body,” (tradução) «corresponder ao valor atual gerado pelo servidor, seu servidor deve retornar um código de status HTTP 304 (Not modified) sem corpo HTTP»; e a parte “no HTTP body” importa porque “your server doesn’t have to spend compute resources on actually generating content” (tradução) «seu servidor não precisa gastar recursos computacionais para realmente gerar conteúdo» e “doesn’t have to transfer the HTTP body” (tradução) «não precisa transferir o corpo HTTP» — você economiza computação e largura de banda nos dois lados. A formulação do Google para o benefício posterior é condicional: essa economia de recursos pode melhorar indiretamente a eficiência do rastreamento. Não é uma promessa de que o esforço economizado será realocado automaticamente para suas URLs novas ou atualizadas — trate-o como um mecanismo de economia de recursos com um benefício secundário plausível, não garantido.

Por que isso importa mais em sites grandes

Se você tem algumas centenas de páginas, isso é em grande parte acadêmico — o Google rastreará seu site inteiro confortavelmente de qualquer maneira. O retorno cresce com o tamanho: um site com centenas de milhares ou milhões de URLs, muitas delas raramente alteradas, se beneficia de forma concreta quando os rastreadores podem evitar buscar novamente todas as que não mudaram. Esse é o público da publicação do Google, e essa é a forma honesta de apresentar o assunto — não venda 304 como uma tática para sites pequenos.

ETag ou Last-Modified, e o que conta como “mudado”

O Google recomenda ETag como validador principal: “We strongly recommend using ETag because it’s less prone to errors and mistakes (the value is not structured unlike the Last-Modified value).” (tradução) «Recomendamos fortemente usar ETag porque ela é menos propensa a erros e enganos (o valor não é estruturado, ao contrário do valor Last-Modified).» Definir os dois é aceitável e incentivado. Se você usar Last-Modified, a data “must be formatted according to the HTTP standard” (tradução) «deve ser formatada de acordo com o padrão HTTP» — o Google recomenda o formato “Weekday, DD Mon YYYY HH:MM:SS Timezone,” (tradução) «Dia da semana, DD Mon AAAA HH:MM:SS Fuso horário», por exemplo, “Fri, 4 Sep 1998 19:15:56 GMT” — ou ela pode ser ignorada silenciosamente. O Google também sugere definir o campo max-age de Cache-Control para ajudar os rastreadores a decidir quando rastrear novamente.

Evidence for this claim Google's crawler guidance recommends ETag because its opaque value avoids date-formatting errors, while also allowing both ETag and Last-Modified; this is Google-specific operational advice, not a change to HTTP validator semantics. Scope: HTTP cache validation Confidence: high · Verified: Crawling December: HTTP caching

O que conta como uma mudança que merece invalidar o cache fica a seu critério, e o conselho do Google é reservá-la para mudanças substanciais: “Our recommendation is that you require a cache refresh on significant changes to your content; if you only updated the copyright date at the bottom of your page, that’s probably not significant.” (tradução) «Nossa recomendação é que você exija uma atualização do cache em mudanças significativas no seu conteúdo; se você apenas atualizou a data de copyright no rodapé da página, isso provavelmente não é significativo.»

O que Googlebot e Bingbot realmente fazem com isso

Nem toda solicitação de rastreador é condicional. A documentação de rastreamento do Google observa que o suporte a cache varia entre rastreadores e buscadores individuais conforme o produto atendido — o Googlebot aceita cache ao rastrear URLs novamente para a Busca, enquanto alguns outros buscadores do Google só o aceitam em determinadas condições — portanto, mesmo com os cabeçalhos configurados corretamente, não espere que 100% das solicitações carreguem If-None-Match/If-Modified-Since. No Bing, as solicitações condicionais não são um recurso exclusivo do Google. O rastreador do Bing aceita GET condicional (enviando If-Modified-Since e, quando disponível, If-None-Match, e aceitando um 304 quando o conteúdo não mudou) desde pelo menos uma publicação do Live Search de 2008 — embora o Bing não tenha publicado um equivalente moderno ao texto do Google de 2024. Trate a mecânica como comportamento HTTP genérico que se aplica aos dois mecanismos.

Como implementar o suporte a 304

  1. Envie validadores no 200. Configure seu servidor, CDN ou aplicativo para anexar uma ETag (recomendada) e/ou um cabeçalho Last-Modified formatado corretamente às respostas 200 normais. Muitos servidores e frameworks geram ETags automaticamente para arquivos estáticos; respostas dinâmicas geralmente exigem ativação explícita.
  2. Respeite os cabeçalhos condicionais na volta. Quando uma solicitação chega com If-None-Match/If-Modified-Since, compare com o validador atual e retorne 304 (sem corpo) quando ele ainda corresponder, ou um 200 novo quando não corresponder. Novamente, servidores de arquivos estáticos costumam cuidar disso; rotas de aplicativo e workers de edge frequentemente não o fazem sem configuração.
  3. Decida o que significa “mudou” e mantenha a ETag estável para conteúdo genuinamente inalterado — não permita que recompressão ou variação por servidor a altere sem necessidade.
  4. Observe as configurações incorretas clássicas:
    • Sempre-200 — nunca emitir validadores, de modo que nenhuma solicitação seja condicional e você nunca obtenha o benefício de eficiência.
    • ETags instáveis — um valor que muda mesmo quando o conteúdo não muda (balanceadores de carga, recompressão), forçando novas buscas constantes.
    • 304s obsoletos — o caso perigoso: um servidor que continua retornando 304 (ou uma ETag inalterada) depois de o conteúdo ter mudado, de modo que rastreadores e caches nunca recebem a atualização. Isso é um bug a ser detectado na análise de logs, não uma falha inerente ao 304.

304 versus outros códigos de status

304 versus 301 / 302 / 307 / 308

Esses são os redirecionamentos de verdade. Um 301/308 (permanente) ou 302/307 (temporário) carrega um cabeçalho Location e move o cliente para uma URL diferente — e 301/308 também passam um sinal de canonicalização. Um 304 não tem Location, não move ninguém e não passa sinal de ranking. Mesma família 3xx pela numeração, função completamente diferente. Os detalhes de cada redirecionamento estão nos próprios artigos (veja o artigo sobre redirecionamento 301 e o sub-hub de redirecionamentos).

304 versus 204 No Content

Ambos não têm corpo, por razões completamente diferentes. Um 204 No Content é um sucesso 2xx com corpo intencionalmente vazio porque o servidor genuinamente não tem nada a enviar — um DELETE/PUT de API bem-sucedido, um beacon de analytics. Um 304 também não envia corpo, mas não porque não haja nada a enviar; é porque “você já tem isto e ele ainda é válido”. Não os confunda: um 204 em uma URL de página pode ser tratado como um soft 404 porque não há conteúdo indexável, enquanto um 304 é uma confirmação de validade para conteúdo que o Google já possui. O artigo sobre 204 No Content aborda esse código em detalhes.

Mitos comuns sobre 304

  1. “304 is a redirect.” (tradução) «304 é um redirecionamento.» Não há cabeçalho Location e ninguém vai a lugar algum. O cliente reutiliza sua própria cópia em cache. O “redirecting the client to make use of that stored representation” (tradução) «redirecionar o cliente para usar aquela representação armazenada» da RFC 9110 significa apontar de volta para o cache, não para outra URL.
  2. “304 is an error I need to fix.” (tradução) «304 é um erro que preciso corrigir.» É o resultado correto e esperado de uma configuração funcional de solicitação condicional. Ver 304s em um rastreamento ou no DevTools é sinal de que o cache está funcionando — o equívoco mais comum na SERP.
  3. “304 helps rankings.” (tradução) «304 ajuda os rankings.» Não há efeito direto no ranking, e o Google também limita o efeito sobre a indexação — a Busca pode recalcular os sinais de uma URL, mas, fora isso, um 304 não altera a indexação. O benefício é a economia de recursos que o Google diz que pode melhorar indiretamente a eficiência do rastreamento em sites muito grandes, mas isso não é sinal de ranking nem garantia de que o esforço economizado será transferido para outras URLs.
  4. “If my server returns 304, Google will use stale content forever.” (tradução) «Se meu servidor retornar 304, o Google usará conteúdo obsoleto para sempre.» O 304 só é emitido enquanto o validador corresponder. Assim que o conteúdo muda de fato, um servidor implementado corretamente retorna um 200 novo com validadores novos. O risco real é um servidor configurado incorretamente que continua retornando 304 depois que o conteúdo mudou — um bug, não uma propriedade do 304. Evidence for this claim RFC 9111 defines validation as checking whether a stored response remains current, typically with a conditional request that can receive 304 Not Modified. Scope: HTTP cache validation; it does not create a Search ranking benefit. Confidence: high · Verified: IETF: RFC 9111 §4.3 — Validation
  5. “ETag and Last-Modified are interchangeable.” (tradução) «ETag e Last-Modified são intercambiáveis.» Ambos são validadores, mas Last-Modified depende do formato da data e tem apenas a granularidade do seu registro de data e hora, enquanto ETag é opaca e precisa (e pode variar de forma problemática entre servidores ou após recompressão, se implementada sem cuidado). O Google recomenda ETag como principal; usar os dois é possível.

Perguntas frequentes

HTTP 304 é um erro? Não — é um sinal de sucesso de que o cache está funcionando. Isso significa que a cópia em cache do cliente ainda é válida.

304 Not Modified é um redirecionamento? Não. Ele está na classe 3xx pela numeração, mas não tem cabeçalho Location e não move o cliente para uma nova URL.

304 ajuda o SEO ou os rankings? Não há efeito direto no ranking nem efeito sobre a indexação além de o Google possivelmente recalcular os sinais de uma URL. Ele economiza largura de banda e computação ao permitir que rastreadores ignorem páginas inalteradas, algo que o Google diz que pode melhorar indiretamente a eficiência do rastreamento em sites grandes.

Qual é a diferença entre ETag e Last-Modified? ETag é uma impressão digital de versão opaca comparada por meio de If-None-Match; Last-Modified é um registro de data e hora comparado por meio de If-Modified-Since. O Google recomenda ETag por ser menos propensa a erros.

O que é uma ETag fraca versus forte? Uma ETag forte afirma que o conteúdo é idêntico byte a byte; uma ETag fraca (com o prefixo W/) afirma equivalência semântica, tolerando diferenças triviais como compactação ou uma data de rodapé alterada.

Por que vejo 304s nos meus logs ou relatórios de rastreamento? Porque os clientes estão fazendo solicitações condicionais e seu servidor está confirmando corretamente que o conteúdo não mudou. Isso é esperado e bom.

Como faço meu servidor retornar 304 corretamente? Envie ETag/Last-Modified no 200; depois respeite If-None-Match/If-Modified-Since na próxima solicitação, retornando 304 sem corpo quando o validador ainda corresponder.

Qual é a diferença entre 304 e 204? Ambos não têm corpo; 204 porque não há nada a enviar, e 304 porque você já tem uma cópia que continua válida.

O Googlebot envia cabeçalhos condicionais em todas as solicitações? Não — o suporte a cache varia conforme o rastreador, portanto nem toda solicitação será condicional mesmo com os cabeçalhos configurados.

Uma resposta 304 pode ter corpo? Não. De acordo com a RFC 9110, “it cannot contain content or trailers.” (tradução) «ela não pode conter conteúdo nem trailers.» Um 304 com corpo viola a especificação.

Evidence for this claim A 304 response terminates after the header section and cannot contain content or trailers. Scope: conditional GET and HEAD Confidence: high · Verified: RFC 9110 §15.4.5: 304 Not Modified

Try it live

This is a real endpoint on this site — not a simulation. Hit it from the button, open it in a new tab, or curl -i it from your terminal, and the server answers with the actual status code this article is about.

Open in new tab ↗

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.