304 Non modifié

Ce que signifie le statut HTTP 304 Non modifié, pourquoi il appartient à la classe 3xx sans être une redirection, comment fonctionnent ETag et Last-Modified et comment il peut améliorer indirectement l’efficacité d’exploration des grands sites sans modifier le classement.

Première publication : 3 juil. 2026 · Dernière mise à jour : 6 août 2026 · Advanced
Langues
1 indice probant sur cette page

HTTP 304 Non modifié est la réponse à une requête GET ou HEAD conditionnelle dont la condition est fausse et qui aurait sinon reçu un 200. C’est une réponse de classe 3xx, mais pas une redirection : elle n’a pas d’en-tête Location et, selon la spécification, aucun corps. Une requête GET/HEAD portant If-None-Match (comparé à ETag) ou If-Modified-Since (comparé à Last-Modified) devient conditionnelle ; lorsque le validateur correspond encore, le serveur renvoie 304 et le client réutilise sa copie en cache. En SEO, elle n’a aucun effet direct sur le classement ; Google possède déjà le contenu, même si Search peut recalculer les signaux d’une URL. Sur les grands sites dont les URL changent rarement, les 304 économisent bande passante et calcul et peuvent améliorer indirectement l’efficacité de l’exploration. Google recommande ETag comme validateur principal et accepte de configurer les deux. Ne confondez pas 304 avec 301, 302, 307 ou 308, qui déplacent l’URL, ni avec 204 No Content, également sans corps mais pour une raison différente.

TL;DR — Une 304 est la réponse à une requête conditionnelle GET/HEAD dont la condition est évaluée comme fausse et qui aurait sinon produit une réponse 200 (RFC 9110 §15.4.5). Elle appartient à la classe 3xx, mais n’est pas une redirection : aucun Location, aucune nouvelle URL et, selon la règle normative, aucun corps — « it cannot contain content or trailers » (traduction) « elle ne peut contenir ni contenu ni bandes-annonces ». La condition est portée par If-None-Match (comparé à un ETag) et/ou If-Modified-Since (comparé à Last-Modified) ; si le validateur correspond toujours, le serveur renvoie 304 et le client réutilise son cache. Côté SEO : aucun effet direct sur le classement — Google possède déjà le contenu, même si Search peut recalculer les signaux d’une URL — et une économie de ressources sur les grands sites (Google indique qu’elle peut améliorer indirectement l’efficacité de l’exploration, sans promettre une réaffectation automatique du budget vers d’autres URL). L’infrastructure d’exploration de Google prend en charge les deux validateurs et recommande ETag en priorité, car il évite les problèmes de format de date. Comparez cette réponse aux 301/302/307/308 (qui déplacent l’URL) et à 204 (également sans corps, mais parce qu’il n’y a réellement rien à envoyer).

Ce que signifie 304 dans la spécification

La RFC 9110 (HTTP Semantics) §15.4.5 le définit précisément : “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.” (traduction) « Le code d’état 304 (Not Modified) indique qu’une requête GET ou HEAD conditionnelle a été reçue et aurait produit une réponse 200 (OK) si la condition n’avait pas été évaluée comme fausse. » C’est le déclencheur normatif : une requête conditionnelle GET/HEAD dont la condition est fausse et qui aurait sinon obtenu 200. En clair, le client demande la page uniquement si elle a changé ; le serveur constate que ce n’est pas le cas et n’envoie donc pas le corps. Une deuxième visite est l’exemple courant qui rend la requête conditionnelle, mais la spécification n’exige aucune visite antérieure : seule la requête conditionnelle compte. 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

La spécification emploie même le mot « redirecting » dans cette section — “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” (traduction) « le serveur redirige donc le client vers cette représentation stockée afin qu’il l’utilise comme si elle était le contenu d’une réponse 200 (OK) » — mais il faut le lire attentivement : le client est renvoyé vers son propre cache, pas vers une autre URL. Il n’y a aucun en-tête Location ni nouvelle adresse. Cette phrase explique l’essentiel de la confusion autour de la question « une 304 est-elle une redirection ? » : pas au sens HTTP.

Deux autres points normatifs sont importants :

  • Aucun corps, jamais. La RFC 9110 dit : “A 304 response is terminated by the end of the header section; it cannot contain content or trailers.” (traduction) « Une réponse 304 se termine à la fin de la section des en-têtes ; elle ne peut contenir ni contenu ni bandes-annonces. » Une 304 qui contient un corps viole la spécification et certains clients peuvent la traiter incorrectement. C’est une règle ferme, pas une préférence de style.
  • Les mêmes métadonnées qu’une 200. Le serveur “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,” (traduction) « DOIT générer tous les champs d’en-tête suivants qui auraient été envoyés dans une réponse 200 (OK) à la même requête : Content-Location, Date, ETag et Vary », ainsi que Cache-Control et Expires lorsque cela s’applique. Une 304 reprend donc les en-têtes de la 200, sans la charge utile.
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

Comment fonctionne réellement une 304 : les requêtes conditionnelles

Un serveur n’envoie jamais une 304 sans raison. C’est toujours la réponse à une requête conditionnelle : le client la rend conditionnelle en lui joignant un validateur enregistré lors d’une réponse précédente. Il existe deux validateurs.

ETag et If-None-Match

Un ETag (entity tag) est un jeton opaque que le serveur joint à une réponse 200 : imaginez une empreinte de version pour la représentation exacte de l’URL. À la requête suivante vers cette URL, le client renvoie la valeur enregistrée dans un en-tête If-None-Match. Le serveur compare les deux valeurs : si l’ETag actuel correspond toujours, rien n’a changé et il renvoie 304 ; s’il diffère, il renvoie une nouvelle 200 avec le contenu mis à jour et un nouvel ETag.

Last-Modified et If-Modified-Since

L’alternative fondée sur la date : le serveur envoie un horodatage Last-Modified avec la 200. Ensuite, le client le renvoie dans un en-tête If-Modified-Since, et le serveur compare les dates. Si la ressource n’a pas changé depuis cet horodatage, il renvoie une 304. Cette méthode est plus simple mais moins précise (elle ne peut pas être plus fine que l’horodatage) et sensible au format exact de la date HTTP, source fréquente de bugs. Lorsque les deux validateurs sont présents, If-None-Match (l’ETag) prend le pas sur If-Modified-Since.

ETags forts et faibles

Un ETag peut être fort ou faible, et cette différence compte. Selon le guide MDN sur les requêtes conditionnelles, “strong validation consists of guaranteeing that the resource is, byte to byte, identical to the one it is compared to.” (traduction) « La validation forte consiste à garantir que la ressource est identique, octet par octet, à celle à laquelle on la compare. » Un ETag faible porte le préfixe W/ (par exemple, ETag: W/"abc123") et affirme seulement une équivalence sémantique. L’exemple de MDN précise qu’“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.” (traduction) « Une page qui ne différerait d’une autre que par une date différente dans son pied de page ou par une publicité différente serait considérée comme identique avec une validation faible. » Les ETags forts (sans préfixe) sont nécessaires pour les requêtes de plage qui exigent une correspondance octet par octet ; les ETags faibles conviennent lorsque la compression, les espaces ou des différences insignifiantes ne doivent pas forcer un nouveau téléchargement. Le piège pratique : si votre ETag change à chaque recompression gzip/Brotli ou varie selon les serveurs derrière un répartiteur, vous déclenchez des réexplorations inutiles. Choisissez le type voulu et gardez sa valeur stable pour un contenu réellement inchangé.

L’échange complet, étape par étape

  1. Première requête → le serveur renvoie 200 OK avec le contenu, ainsi que ETag et/ou Last-Modified.
  2. Le client enregistre le contenu et ces validateurs.
  3. Requête suivante → le client envoie If-None-Match et/ou If-Modified-Since avec les valeurs enregistrées.
  4. Le serveur décide : contenu inchangé → 304 Not Modified, sans corps, et le client réutilise son cache ; contenu modifié → 200 OK avec le nouveau corps et de nouveaux validateurs. 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

Si vous souhaitez approfondir la mise en cache et les validateurs comme levier d’efficacité d’exploration — l’ensemble de l’histoire des requêtes conditionnelles et son lien avec le budget d’exploration — consultez l’article compagnon. Celui-ci reste centré sur le code d’état.

304 et SEO : aucun effet sur le classement, un vrai gain d’efficacité d’exploration

Voici toute l’histoire SEO, plus limitée que ne le laisse entendre beaucoup de textes génériques. Une 304 n’a aucun effet direct sur le classement, et les propres indications de Google sur l’effet des codes d’état sur l’exploration et l’indexation en bornent aussi la portée : Search peut recalculer les signaux d’une URL, mais une 304 ne modifie pas autrement son indexation. Google possède déjà le contenu de l’exploration précédente ; une 304 confirme simplement que rien n’a changé. Il n’existe donc aucun bonus de classement à renvoyer des 304.

Ce qu’une 304 vous apporte, ce sont des économies de ressources susceptibles d’améliorer indirectement l’efficacité de l’exploration. Dans son article de décembre 2024 sur la mise en cache HTTP, Gary Illyes l’explique ainsi : “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.” (traduction) « Pour un site vaste dont les URL changent rarement, autoriser la mise en cache locale peut rendre l’exploration plus efficace. Selon la norme HTTP, l’infrastructure d’exploration de Google s’appuie notamment sur ETag/If-None-Match et Last-Modified/If-Modified-Since. »

Sur le mécanisme précis de la 304, le même article explique pourquoi l’absence de corps est essentielle : si l’ETag envoyé par le robot “matches the current value the server generated, your server should return an HTTP 304 (Not modified) status code with no HTTP body,” (traduction) « correspond à la valeur actuelle générée par le serveur, celui-ci doit renvoyer une réponse HTTP 304 (Not modified) sans corps HTTP ». Cette absence de corps compte parce que “your server doesn’t have to spend compute resources on actually generating content” (traduction) « votre serveur n’a pas à dépenser de ressources de calcul pour générer réellement le contenu » et “doesn’t have to transfer the HTTP body” (traduction) « n’a pas à transférer le corps HTTP ». Vous économisez donc du calcul et de la bande passante des deux côtés. Google décrit le bénéfice en termes conditionnels : ces économies peuvent améliorer indirectement l’efficacité de l’exploration. Ce n’est pas la promesse que l’effort épargné sera automatiquement réaffecté à vos URL nouvelles ou mises à jour ; considérez-le comme un mécanisme d’économie de ressources dont le ruissellement est plausible, mais non garanti.

Pourquoi cela compte davantage sur les grands sites

Si vous avez quelques centaines de pages, l’effet reste largement théorique : Google explorera confortablement l’ensemble du site. Le bénéfice augmente avec la taille : un site comptant des centaines de milliers ou des millions d’URL, dont beaucoup changent rarement, gagne réellement à ce que les robots évitent de retélécharger les ressources inchangées. C’est le public visé par l’article de Google, et c’est le cadrage honnête à conserver : ne présentez pas la 304 comme une tactique indispensable aux petits sites.

ETag ou Last-Modified, et ce qui compte comme une « modification »

Google recommande ETag comme validateur 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). » (traduction) « Nous recommandons vivement ETag, car il est moins sujet aux erreurs et aux fautes (sa valeur n’est pas structurée, contrairement à celle de Last-Modified). » Configurer les deux est possible et encouragé. Si vous utilisez Last-Modified, la date « must be formatted according to the HTTP standard » (traduction) « doit respecter le format de la norme HTTP » ; Google recommande le format « Weekday, DD Mon YYYY HH:MM:SS Timezone, » (traduction) « Jour, JJ Mmm AAAA HH:MM:SS Fuseau », par exemple « Fri, 4 Sep 1998 19:15:56 GMT » (traduction), sinon elle peut être ignorée silencieusement. Google suggère également de définir le champ max-age de Cache-Control pour aider les robots à décider quand explorer de nouveau.

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

Ce qui mérite d’invalider le cache relève de votre décision, mais Google conseille de réserver cette opération aux changements substantiels : “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.” (traduction) « Nous vous recommandons d’exiger un rafraîchissement du cache lors des changements importants de votre contenu ; si vous avez seulement modifié la date de copyright au bas de la page, ce changement n’est probablement pas important. »

Ce que Googlebot et Bingbot en font réellement

Toutes les requêtes de robots ne sont pas conditionnelles. La documentation de Google indique que la prise en charge de la mise en cache varie selon les robots et les récupérateurs Google, en fonction du produit desservi : Googlebot la prend en charge lors de nouvelles explorations d’URL pour Search, tandis que certains autres récupérateurs ne l’utilisent que dans certaines conditions. Même avec des en-têtes correctement configurés, ne vous attendez donc pas à ce que 100 % des requêtes portent If-None-Match ou If-Modified-Since. Pour Bing, les requêtes conditionnelles ne sont pas propres à Google. Le robot de Bing prend en charge les GET conditionnels (avec If-Modified-Since et, lorsqu’il est disponible, If-None-Match, puis l’acceptation d’une 304 lorsque le contenu est inchangé) depuis au moins un article Live Search de 2008. Bing n’a toutefois pas publié d’équivalent moderne de l’article de Google de 2024. Considérez donc ce mécanisme comme un comportement HTTP générique qui s’applique aux deux moteurs.

Comment mettre en œuvre la prise en charge de 304

  1. Envoyer les validateurs avec la 200. Configurez votre serveur, votre CDN ou votre application pour joindre un ETag (recommandé) et/ou un en-tête Last-Modified au format correct aux réponses 200 normales. De nombreux serveurs et frameworks génèrent automatiquement les ETags pour les fichiers statiques ; les réponses dynamiques nécessitent généralement une activation explicite.
  2. Respecter les en-têtes conditionnels à la requête suivante. Lorsqu’une requête contient If-None-Match/If-Modified-Since, comparez-les au validateur actuel et renvoyez 304 (sans corps) lorsqu’il correspond toujours, ou une nouvelle 200 dans le cas contraire. Les serveurs de fichiers statiques le font souvent pour vous ; les routes applicatives et les edge workers ne le font pas nécessairement sans configuration.
  3. Décider ce que signifie « modifié » et conserver l’ETag stable pour un contenu réellement inchangé. Ne laissez pas une recompression ou une variation entre serveurs le faire changer inutilement.
  4. Surveiller les erreurs classiques :
    • Toujours 200 — aucun validateur n’est émis, donc aucune requête ne devient conditionnelle et vous perdez le gain d’efficacité.
    • ETags instables — une valeur change alors que le contenu ne change pas (répartiteur de charge, recompression), ce qui force des retéléchargements constants.
    • 304 périmées — le cas dangereux : le serveur continue de renvoyer 304 (ou le même ETag) après une vraie modification du contenu ; robots et caches ne récupèrent alors jamais la mise à jour. C’est un bug à rechercher dans l’analyse des journaux, pas un défaut inhérent à la 304.

304 vs. autre status codes

304 par rapport à 301 / 302 / 307 / 308

Ce sont les véritables redirections. Une 301/308 (permanente) ou une 302/307 (temporaire) transporte un en-tête Location et déplace le client vers une URL différente — les 301/308 transmettent également un signal de canonicalisation. Une 304 n’a pas de Location, ne déplace personne et ne transmet aucun signal de classement. Même famille 3xx par le numéro, mais fonction complètement différente. Le détail de chaque redirection figure dans ses propres articles (voir l’article sur la redirection 301 et le sous-centre des redirections).

304 vs. 204 aucun contenu

Les deux réponses n’ont pas de corps, mais pour des raisons totalement différentes. Une 204 No Content est un succès 2xx dont le corps est volontairement vide parce que le serveur n’a réellement rien à envoyer — par exemple après un DELETE/PUT d’API réussi ou pour une balise d’analyse. Une 304 n’envoie pas non plus de corps, mais non parce qu’il n’y aurait rien à envoyer : elle signifie « vous l’avez déjà et elle reste valide ». Ne les confondez pas : une 204 sur une URL de page peut être traitée comme un soft 404 faute de contenu indexable, tandis qu’une 304 confirme la validité du contenu que Google possède déjà. L’article sur 204 No Content couvre entièrement ce code.

Mythes courants à propos de 304

  1. « 304 est une redirection. » Aucun en-tête Location, personne ne va nulle part. Le client réutilise sa propre copie en cache. L’expression “redirecting the client to make use of that stored representation” (traduction) « rediriger le client pour qu’il utilise cette représentation stockée » de la RFC 9110 signifie un retour vers le cache, pas vers une autre URL.
  2. « 304 est une erreur à corriger. » C’est le résultat correct et attendu d’une configuration fonctionnelle des requêtes conditionnelles. Voir des 304 dans un crawl ou dans DevTools indique que la mise en cache fonctionne.
  3. « 304 améliore le classement. » Elle n’a aucun effet direct sur le classement et Google borne aussi l’effet d’indexation : Search peut recalculer les signaux d’une URL, mais une 304 ne modifie pas autrement l’indexation. Le bénéfice vient des économies de ressources qui peuvent améliorer indirectement l’efficacité de l’exploration sur les grands sites ; ce n’est ni un signal de classement ni une garantie de réaffectation.
  4. “If my server returns 304, Google will use stale content forever.” (traduction) « Si mon serveur renvoie 304, Google utilisera du contenu périmé pour toujours. » La 304 ne s’applique que tant que le validateur correspond. Dès que le contenu change réellement, un serveur correctement mis en œuvre renvoie une nouvelle 200 avec de nouveaux validateurs. Le vrai risque est un serveur mal configuré qui continue de renvoyer 304 après une modification.
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
  1. « ETag et Last-Modified sont interchangeables. » Ce sont tous deux des validateurs, mais Last-Modified dépend du format de date et de la précision de l’horodatage, tandis que ETag est opaque et précis. Google recommande ETag en priorité et les deux si possible.

Questions fréquentes

Une réponse HTTP 304 est-elle une erreur ? Non : c’est le signe que la mise en cache fonctionne. Elle signifie que la copie en cache du client est toujours valide.

Une 304 est-elle une redirection ? Non. Elle appartient à la classe 3xx par sa numérotation, mais ne contient aucun en-tête Location et ne déplace pas le client vers une nouvelle URL.

Une 304 aide-t-elle le SEO ou le classement ? Elle n’a aucun effet direct sur le classement et aucun effet sur l’indexation au-delà d’un éventuel recalcul des signaux d’une URL par Google. Elle économise de la bande passante et du calcul en permettant aux robots d’éviter les pages inchangées ; Google indique que cela peut améliorer indirectement l’efficacité de l’exploration sur les grands sites.

Quelle est la différence entre ETag et Last-Modified ? ETag est une empreinte de version opaque comparée via If-None-Match ; Last-Modified est un horodatage comparé via If-Modified-Since. Google recommande ETag, moins sujet aux erreurs.

Qu’est-ce qui distingue un ETag faible d’un ETag fort ? Un ETag fort affirme que le contenu est identique octet par octet ; un ETag faible (préfixé par W/) affirme une équivalence sémantique et tolère des différences insignifiantes, comme la compression ou la date modifiée d’un pied de page.

Pourquoi vois-je des 304 dans mes journaux ou rapports d’exploration ? Parce que les clients envoient des requêtes conditionnelles et que votre serveur confirme correctement que le contenu n’a pas changé. C’est attendu et souhaitable.

Comment faire renvoyer correctement une 304 à mon serveur ? Envoyez ETag/ Last-Modified avec la 200, puis respectez If-None-Match/If-Modified-Since à la requête suivante en renvoyant 304 sans corps lorsque le validateur correspond toujours.

Quelle est la différence entre 304 et 204 ? Les deux sont sans corps : 204 parce qu’il n’y a rien à envoyer, 304 parce que le client possède déjà une copie toujours valide.

Googlebot envoie-t-il des en-têtes conditionnels à chaque requête ? Non : la prise en charge de la mise en cache varie selon le robot, donc toutes les requêtes ne sont pas conditionnelles, même avec des en-têtes correctement configurés.

Une réponse 304 peut-elle contenir un corps ? Non. Selon la RFC 9110, “it cannot contain content or trailers.” (traduction) « elle ne peut contenir ni contenu ni bandes-annonces ». Une 304 avec un corps viole la spécification.

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.