304 Not Modified is an HTTP status code that tells a client its cached copy of a resource is still current, so the server does not send the content again. It answers a conditional GET or HEAD request.
At a glance
- Status code
- 304
- Class
- 3xx (redirection)
- Duration
- n/a (answer to a conditional request)
- In Google
- crawler passes on that the content is the same as at the last crawl; otherwise no effect on indexing
- Request method
- answer to a conditional GET or HEAD, no body
- Specification
- RFC 9110, Section 15.4.5
Last checked:
How does a 304 response work?
The client sends a validator from an earlier response, either If-None-Match with an ETag or If-Modified-Since with a date. If the resource has not changed, the server replies with 304 and no body. If it has changed, the server replies with 200 and the full content. MDN lists headers such as Cache-Control, ETag, Date and Vary as allowed in a 304.
Google’s crawlers support ETag and Last-Modified validators, though not every crawler uses them in each request. For a 304, Google’s documentation says the crawler passes on that the content is the same as at the last crawl. In its crawl budget guide, Google lists support for 304 among the ways to reduce server load on large sites.
| Header / status | Request counterpart | What it does | Relevance for Google's crawlers |
|---|---|---|---|
Cache-Control | – (directives can also appear in requests) | lists directives for caches, e.g. max-age (fresh for N seconds), no-cache (reuse only after revalidation), no-store (do not store) | max-age is optional and helps crawlers decide when to recrawl the URL; Google does not support other caching directives |
ETag | If-None-Match | identifier for the current version of a resource | supported and recommended by Google because it has no date formatting issues; takes precedence when both validators are present |
Last-Modified | If-Modified-Since | date and time at which the server believes the resource was last modified | supported; the date must follow the HTTP format, e.g. Fri, 4 Sep 1998 19:15:56 GMT |
304 Not Modified (this term) | response to a conditional GET or HEAD request | signals that the stored copy is still valid; the response has no body | the crawler tells the next system that the content is the same as at the last crawl; Search may recalculate signals, otherwise no effect on indexing |
Google suggests setting both ETag and Last-Modified, since other applications use them too. Whether a Google crawler uses caching depends on its product: Googlebot uses it when recrawling URLs for Google Search. According to Google's December 2024 blog post, only 0.017% of all fetches could be served from cache. Sources: Google Crawling Infrastructure: Overview of Google crawlers and fetchers, HTTP caching (last updated 2026-06-12); Google Search Central Blog: Crawling December: HTTP caching (2024-12-09); Google Crawling Infrastructure: HTTP status codes, network and DNS errors (last updated 2026-02-04); MDN: HTTP caching; RFC 9111: HTTP Caching; RFC 9110: HTTP Semantics (8.8.2 Last-Modified, 8.8.3 ETag, 15.4.5 304). Last checked: .
Example
GET /page/ HTTP/1.1
If-None-Match: "abc123"
HTTP/1.1 304 Not Modified
ETag: "abc123"
Common mistakes
A server sends 304 for every request, or a 304 for a changed page. The crawler then keeps the old version.
Sources
- 304 Not Modified – MDNdeveloper.mozilla.org
- How HTTP status codes, and network and DNS errors affect Google Search – Google Search Centraldevelopers.google.com
- Crawl budget management for large sites – Google Search Centraldevelopers.google.com
- HTTP caching of Google's crawlers – Google Crawling Infrastructuredevelopers.google.com
Last updated: