Meet Grove. Your AI growth strategist. Get a free diagnosis in 4 minutes.
Try Grove Free
When your buyer asks AI, who gets named? Run a free check
Check AI Answer Gap
Transparent Growth Measurement (NPS)

What Is the 304 Status Code (Not Modified)? Meaning, Examples and SEO Impact [2026]

Contributors: Amol Ghemud
Published: March 12, 2026

upGrowth Digital - Growth Marketing Insights

Summary

A 304 Not Modified response means the server confirmed a cached copy is still current, so it sends headers only and the client reuses its stored file. This guide covers the ETag and Last-Modified headers behind it, how Google treats 304s, and 6 checks to fix stale-content problems.

Share On:

You open a site you visited yesterday and it loads almost instantly. Part of that speed comes from the 304 status code, the HTTP response a server sends when your browser already holds a valid copy of a file.

This guide explains what HTTP 304 Not Modified means, the headers behind it, how Googlebot treats it and how to fix stale-content problems.

What Does the 304 Status Code Mean?

A 304 status code (304 Not Modified) means the server checked your browser’s cached copy, found it’s still current, and replied with headers only, no body. The browser then loads the file from its cache. RFC 9110 defines it as the answer to a conditional GET or HEAD request whose condition evaluated to false.

304 status code meaning: cached copy plus conditional request plus unchanged resource equals 304 Not Modified

In plain terms, status 304 means “nothing changed, use what you have.” Otherwise, the server would have sent a 200 OK with the full resource (MDN’s 304 reference).

Is a 304 code an error or a redirect?

It’s not an error, and it doesn’t send anyone to a new URL. RFC 9110 lists 304 in the 3xx redirection class as “redirection to a previously stored result.” So a 304 error code usually means caching is working as designed.

304 vs 200, 301, 302 and 404: How the Status Codes Compare

A 200 sends the full resource, a 301 or 302 points to another URL, a 404 says nothing was found, and a 304 tells the client to reuse the copy it already stores. Only a 304 response code needs a cached copy first.

304 status code vs 200 OK comparison: headers only versus full resource
304 status code vs other HTTP status codes (RFC 9110, Google Search Central)
Status codeMeaningWhat the client receivesHow Google Search treats it
200 OKRequest succeededFull resource in the bodyPasses the content to the indexing pipeline
301 Moved PermanentlyNew permanent URLA Location header with the new URLStrong signal to process the redirect target
302 FoundTemporarily at a different URLA Location header with the temporary URLWeak signal to process the redirect target
304 Not ModifiedCached copy is still validHeaders only, no bodyContent is the same as the last crawl; no other effect on indexing
404 Not FoundNo current representation foundAn error responseNot indexed; indexed URLs are removed
500 Internal Server ErrorUnexpected server conditionAn error responseIndexed URLs kept at first, eventually dropped

The last column comes from Google’s HTTP status code documentation. For temporary redirects, read our guide to the 302 status code.

How Does a 304 Not Modified Response Work? Step by Step

A 304 happens in 3 steps: the server hands out a validator with the first response, the browser sends it back later, and the server compares it with the current file. If they match, the answer is 304.

How the 304 status code works: first visit, conditional request, server returns 304 or 200

Step 1: First visit, the server sends validators

No cache exists yet, so the server replies with the full content plus caching headers:

HTTP/1.1 200 OK
Last-Modified: Tue, 03 Mar 2026 10:00:00 GMT
ETag: "abc123"
Cache-Control: max-age=86400

With max-age=86400 the stored copy stays fresh for 24 hours and is reused without contacting the server (MDN’s HTTP caching guide).

Step 2: Return visit, the browser sends a conditional request

Once the copy goes stale, the browser asks again with the validators it saved:

GET /page.html HTTP/1.1
If-None-Match: "abc123"
If-Modified-Since: Tue, 03 Mar 2026 10:00:00 GMT

Step 3: The server returns 304 or 200

If the ETag matches, the server replies 304 with no body; if the file changed, it sends 200 OK. Per RFC 9110 section 15.4.5, a 304 must still include headers such as Date, ETag and Cache-Control that a 200 would have sent:

HTTP/1.1 304 Not Modified
Date: Wed, 04 Mar 2026 10:00:00 GMT
ETag: "abc123"
Cache-Control: max-age=86400

Headers that control a 304 response

  • Last-Modified (server to browser): date and time of the last change.
  • ETag (server to browser): an opaque tag for this version of the file.
  • If-Modified-Since (browser to server): send the file only if it changed after this date.
  • If-None-Match (browser to server): send the file only if its ETag no longer matches.
  • Cache-Control (server to browser): how long the copy stays fresh, or whether it must be revalidated first.

Prefer ETags for dynamic pages. Under RFC 9110 section 13.1.3, a server must ignore If-Modified-Since when If-None-Match is present, because the entity tag check is considered more accurate.

Watch: 304 Not Modified explained

4 Real-World 304 Examples: CSS Files, Blog Posts, APIs and CDNs

You’ll see 304 responses wherever a client revalidates something it already stores.

Example 1: CSS and JavaScript files

Your stylesheet hasn’t changed in a week, so returning visitors with stale copies get a 304 and reuse the stored file. As an illustration, skipping a 150KB file for 10,000 returning visitors a day avoids about 1.5GB of transfer daily (headers still travel).

Example 2: A blog post that hasn’t been updated

A reader revisits last month’s post. The HTML returns 304, so the page renders from cache faster than on the first visit. Googlebot can get the same 304 when it recrawls the URL.

Example 3: API responses

A 304 status code in an API works the same way. A client sends the stored ETag in If-None-Match, and the API answers 304 when the data hasn’t changed. RFC 9110 calls this updating cached information “with a minimum amount of transaction overhead.”

Example 4: CDN edge caches

CDNs revalidate too. Cloudflare’s ETag documentation says matching ETag values produce a 304, though Cloudflare can weaken or remove strong ETags depending on compression and some settings.

Does the 304 Status Code Affect SEO?

Not directly. Google says a 304 tells its systems the content is the same as at the last crawl; the indexing pipeline may recalculate signals, but the code otherwise has no effect on indexing. The benefits are indirect.

How Googlebot handles a 304

Google’s crawlers support ETag with If-None-Match and Last-Modified with If-Modified-Since. Google recommends ETag because it avoids date formatting issues, and uses the ETag when both headers are present.

Crawl budget on large sites

Google’s crawl budget guide advises supporting 304 so Google can reuse its cached version, saving your bandwidth and server resources. It targets sites with 1 million+ unique pages that change weekly, or 10,000+ pages that change daily.

Page speed and server load

A 304 skips the response body, so repeat visits transfer less data and servers do less work. Google confirms Core Web Vitals are used by its ranking systems, though there’s no single page experience signal. Our website speed optimization tips cover the rest.

How to Fix 304 Not Modified Problems

A 304 isn’t a fault. Trouble starts when a server keeps answering 304 after content changes, so people see stale pages, or answers 200 every time, so nothing is revalidated. Work through these 6 checks.

304 status code troubleshooting checklist with 6 checks for 304 Not Modified problems

Check your server configuration

Confirm ETag and Last-Modified change whenever content changes. If an updated page still returns a 304 status code, a stale ETag is the first suspect. Avoid no-store on pages you want crawled efficiently: under RFC 9111 it bans storing the response, while no-cache still allows 304 revalidation.

Inspect the browser cache

A normal reload revalidates with If-None-Match, while a force reload sends Cache-Control: no-cache, per MDN’s caching guide. If a force reload shows new content, the old copy was simply cached.

Verify CDN settings

Compare the ETag your origin sends with the one visitors get. On Cloudflare, compression mismatches, Email Obfuscation and Automatic HTTPS Rewrites can weaken or strip ETags.

Test different devices and browsers

Compare a private window, a second browser and a phone. If only 1 device shows old content, clear that cache. If all do, look at the server or CDN.

Use developer tools and logs

In Chrome DevTools, check each request’s status and Response Headers in the Network tab. Tick Disable cache to see a first visit. MDN notes network panels can trigger extra 304s, so confirm patterns in server logs during your technical SEO audit.

Version files that change

Put a version number or hash in CSS and JavaScript file names and serve them with a long max-age. MDN calls this cache busting: a changed file gets a new URL, so nobody is stuck with an old copy.

304 Status Code FAQs

Is a 304 Not Modified response good or bad?

A 304 is good. It means caching works: the server confirmed the stored copy is current and skipped resending the body, which saves bandwidth and speeds up repeat visits. It’s only a problem when the server keeps returning 304 after content changes, usually because the ETag didn’t update.

Does a 304 status code affect SEO?

Not directly. Google’s documentation says a 304 tells its systems the content is the same as at the last crawl. The indexing pipeline may recalculate signals, but otherwise the code has no effect on indexing. Indirectly, 304 support saves server resources during crawls.

What is the difference between a 304 and a 200 from cache?

A 304 needs a round trip: the browser asks whether its copy is still valid and the server answers with headers only. A 200 from cache involves no request at all, because the stored response is still fresh under its Cache-Control max-age, so the browser reuses it without contacting the server.

Why do I see status 304 in the browser network tab?

Your browser already had those files, revalidated them, and the server confirmed they hadn’t changed. That’s normal on repeat visits. MDN notes developer tools can create extra requests that lead to 304 responses, so tick Disable cache in Chrome DevTools to see a first-time visit.

Why does Google Search Console show 304 responses?

The Crawl Stats report, under Settings, groups crawl requests by response. Google describes Not modified (304) as a page that hasn’t changed since the last crawl request, so it’s normal for stable pages. If an updated page still returns 304, check that your ETag or Last-Modified value changes with the content.

How do I make my server return 304 responses?

You can’t force a 304 directly. Configure your server or CDN to send ETag or Last-Modified headers, plus Cache-Control. Browsers and crawlers then send conditional requests with If-None-Match or If-Modified-Since, and the server answers 304 automatically whenever the resource hasn’t changed since their last visit.

Your Next Move: Get Your Caching Headers Right

A 304 is a sign of healthy caching, not an error. Make sure validators update when content changes, and that repeat visitors and crawlers get 304s for everything else.

Our technical SEO services team reviews cache headers, CDN settings and Core Web Vitals together. Contact us to request an audit.

For Curious Minds

These headers provide a unique signature for a resource, allowing the server to check if the browser's cached version is current without re-sending the file. This validation process is the foundation of the 304 Not Modified response, which conserves bandwidth and drastically shortens load times for users who have visited your site before. The server sends these validator headers with the initial 200 OK response, preparing the browser for future checks. The conditional validation works through a request-response cycle:
  • Last-Modified: A timestamp indicating the last alteration. The browser sends this back in an `If-Modified-Since` header.
  • ETag (Entity Tag): A unique identifier, often a content hash, that is more accurate than a timestamp. The browser sends this back in an `If-None-Match` header.
Implementing this strategy correctly is vital for efficient content delivery. By enabling the server to respond with a lightweight 304 status, you avoid unnecessary data transfer, which directly improves the user experience. You can find more details on configuring these headers in the complete guide.

Generated by AI
View More

About the Author

amol
Optimizer in Chief

Amol has helped catalyse business growth with his strategic & data-driven methodologies. With a decade of experience in the field of marketing, he has donned multiple hats, from channel optimization, data analytics and creative brand positioning to growth engineering and sales.

Download The Free Digital Marketing Resources upGrowth Rocket
We plant one 🌲 for every new subscriber.
Want to learn how Growth Hacking can boost up your business?
Contact Us
Contact Us