304 Not Modified

La copie en cache est toujours valide.

Quand l’utiliser

Réponse à une requête conditionnelle avec If-None-Match ou If-Modified-Since.

Bon à savoir

304 répond à une requête conditionnelle. Quand une réponse porte un en-tête ETag ou Last-Modified, le navigateur envoie ensuite If-None-Match ou If-Modified-Since, et le serveur répond 304 sans corps si rien n’a changé, ce qui économise de la bande passante. Un 304 doit répéter les en-têtes comme ETag, Cache-Control et Vary, afin que le cache puisse rafraîchir sa copie et sa date d’expiration.

Les ETag générés par machine, comme les anciens ETag d’Apache basés sur l’inode, diffèrent d’un serveur à l’autre derrière un répartiteur de charge, si bien que les clients obtiennent rarement un 304. La compression peut aussi modifier ou affaiblir les ETag. Dans les DevTools, un 304 transfère quelques centaines d’octets, alors que « from disk cache » avec un statut 200 signifie qu’aucune requête n’a été envoyée. fetch masque les revalidations du navigateur et les présente comme des 200 avec le corps en cache.

Redirection (3xx)

Les codes 3xx sont des redirections : le client doit aller ailleurs, ou utiliser sa copie en cache, pour terminer la requête.

À quoi ça ressemble

HTTP/1.1 304 Not Modified

Comment l’envoyer

Node.js / Expressres.status(304).end()
Python / Flaskreturn '', 304
nginxreturn 304;

Comment le vérifier

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

Ouvrir l’outil Codes de statut HTTP