Runs in your browser. Your files and text never leave your device - nothing is uploaded.
3xx Redirection
What it means
The resource hasn't changed since the version specified by request headers, so the client can use its cached copy.
| Property | Detail |
|---|---|
| Status class | 3xx Redirection |
| Defined in | RFC 9110, Section 15.4.5 |
| Cacheable by default | Not stored as a response of its own. A cache uses it to refresh the copy it already holds (RFC 9111, Section 4.3.4). |
| Who needs to act | No one. It is caching working as designed. |
What does HTTP 304 Not Modified mean?
HTTP 304 Not Modified means the client's cached copy is still current, so the server sends no body. It answers a conditional GET or HEAD that carried If-None-Match with an ETag, or If-Modified-Since with a date. The client then reuses its stored copy, saving bandwidth while still confirming freshness.
How 304 Not Modified works
A 304 is the cheap half of revalidation. When a cached response goes stale, the browser asks again with a validator: If-None-Match carrying the ETag it saved, or If-Modified-Since carrying the Last-Modified date. If nothing changed, the server replies 304 with headers only. RFC 9110 requires the 304 to include whichever of Cache-Control, Content-Location, Date, ETag, Expires and Vary a 200 would have carried, so the cache can update its stored metadata. Although it sits in the 3xx class, a 304 redirects the client to its own cache rather than to another URL.
Example 304 request and response
GET /assets/app.css HTTP/1.1
Host: example.com
If-None-Match: "33a64df5"
HTTP/1.1 304 Not Modified
ETag: "33a64df5"
Cache-Control: max-age=600The ETag matched, so the stylesheet is not resent, and the new max-age gives the cached copy another ten minutes of freshness.
When servers send 304 Not Modified
- A browser revalidating a stale stylesheet, image or page it already has.
- A CDN revalidating its copy with the origin server.
- API clients and crawlers that store ETags and send them back.
How to handle 304 Not Modified
If a change you deployed is not showing
- A 304 means the server believes nothing changed. Check that your deploy actually updates the file's ETag or Last-Modified.
- Use versioned or hashed file names for static assets, so each release has new URLs.
If you run the server
- Generate reliable ETags or Last-Modified dates, and make sure every server behind a load balancer produces the same ETag for the same file.
- Never send a body with a 304; RFC 9110 says the response ends after the headers.
- Repeat Cache-Control and ETag on the 304 so caches update their stored metadata.
304 and SEO
Google's crawler documentation says a 304 tells its indexing pipeline that the content is the same as at the last crawl. Signals for the URL may be recalculated, but the status has no other effect on indexing. Supporting conditional requests therefore saves bandwidth for both your server and the crawler.
Related status codes
- 200 OK: Sent with the full body when the validator no longer matches.
- 412 Precondition Failed: A different kind of condition: an If-Match on an update failed, so the change was refused.
- 206 Partial Content: Sends part of the resource rather than none of it.
Frequently asked questions
The resource hasn't changed since the version specified by request headers, so the client can use its cached copy.
Returned when a client sends conditional headers (If-Modified-Since or If-None-Match) and the resource is unchanged.
No fix needed - use the cached version of the resource.
No. It means caching is working: the client already has the latest version, so the server skips the body. Browser developer tools often show many 304s on repeat visits, and each one is a request that saved bandwidth.
Sources
- RFC 9110, Section 15.4.5
- RFC 9111, Section 4.3.4 (freshening stored responses)
- Google: How HTTP status codes affect Google's crawlers
Other 3xx Redirection codes
Reviewed by Raja Jahangir · Last reviewed: October 7, 2026
