What it means
The cached copy the client already has is still valid, so the server sends no body. It answers a conditional request with If-None-Match or If-Modified-Since.
Common causes
- The ETag in If-None-Match matches the current version
- The resource did not change since If-Modified-Since
- A browser revalidating a cached asset
How to fix it
As a client or visitor
Use the cached body. If content looks stale, the validator may be wrong; force a reload or check ETag generation.
As the site or API owner
Generate stable ETags (identical across servers behind a load balancer) and send the same caching headers you would send with 200.
Example response
HTTP/1.1
HTTP/1.1 304 Not Modified
Date: Tue, 07 Oct 2025 09:30:00 GMT
Server: nginx
ETag: "33a64df5"
Cache-Control: max-age=3600 Specification
FAQ
› Is 304 an error?
No. It saves bandwidth by telling the client its cache is up to date.
› Why do users see old files after a deploy?
Cache headers allow stale copies. Use fingerprinted file names for assets and short max-age with validation for HTML.