{"id":4263,"date":"2026-11-04T11:05:00","date_gmt":"2026-11-04T11:05:00","guid":{"rendered":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/"},"modified":"2026-11-09T22:05:02","modified_gmt":"2026-11-09T22:05:02","slug":"http-304-not-modified","status":"publish","type":"post","link":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/","title":{"rendered":"HTTP 304 Not Modified: What It Means and When It Is a Problem"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">HTTP 304 Not Modified means &#8220;you already have the latest copy&#8221;. A browser, CDN or crawler that has a file in its cache asks the server whether it has changed, usually by sending the file&#8217;s ETag or last-modified date. If nothing has changed, the server replies 304 with headers only and no body, and the client uses its cached copy. A 304 is not an error. It saves bandwidth and makes repeat visits faster. It only becomes a problem when visitors keep seeing old content after you have changed a file, or when you expected a 304 and always get a full 200.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"234\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified-screenshot-1024x234.png\" alt=\"Terminal showing curl returning HTTP 200 with a last-modified header, then HTTP 304 for an If-Modified-Since request\" class=\"wp-image-4265\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified-screenshot-1024x234.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified-screenshot-300x68.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified-screenshot-768x175.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified-screenshot.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">A conditional request in practice: the first request returns 200 with Last-Modified, the second sends If-Modified-Since and gets 304<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What the 304 status code means<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html#name-304-not-modified\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 9110<\/a>, the HTTP standard, says a 304 indicates that a conditional GET or HEAD request &#8220;would have resulted in a 200 (OK) response if it were not for the fact that the condition evaluated to false&#8221;. In plain terms, the client said &#8220;send this only if it differs from my copy&#8221;, and it does not. The same section says a 304 ends with the headers: it cannot contain content.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A client makes a request conditional with one of two headers, both built from what the server sent the first time:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Server sends (first response)<\/th><th>Client sends back later<\/th><th>Server answers 304 when<\/th><\/tr><\/thead><tbody><tr><td><code>ETag: \"6abcaa5d-1a90\"<\/code><\/td><td><code>If-None-Match: \"6abcaa5d-1a90\"<\/code><\/td><td>The current ETag matches<\/td><\/tr><tr><td><code>Last-Modified: &lt;date&gt;<\/code><\/td><td><code>If-Modified-Since: &lt;same date&gt;<\/code><\/td><td>The file has not changed since that date<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If both headers arrive, the ETag wins. RFC 9110 says a server must ignore If-Modified-Since when the request contains If-None-Match, because the ETag comparison is the more accurate test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">See a 304 for yourself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We served a 6,800-byte stylesheet from nginx 1.31.6 (the <code>nginx:alpine<\/code> Docker image) and requested it with curl 8.22.0. The first request is a normal 200 with both validators:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ curl -sI http:\/\/web\/style.css\nHTTP\/1.1 200 OK\nContent-Type: text\/css\nContent-Length: 6800\nLast-Modified: Wed, 30 Sep 2026 06:21:17 GMT\nETag: \"6abcaa5d-1a90\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sending the ETag back gives a 304, and the transfer is empty:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ curl -sI -H 'If-None-Match: \"6abcaa5d-1a90\"' http:\/\/web\/style.css\nHTTP\/1.1 304 Not Modified\nLast-Modified: Wed, 30 Sep 2026 06:21:17 GMT\nETag: \"6abcaa5d-1a90\"\n\n$ curl -s -o \/dev\/null -w '%{http_code} %{size_download} bytes\\n' -H 'If-None-Match: \"6abcaa5d-1a90\"' http:\/\/web\/style.css\n304 0 bytes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The same file without the header downloaded 6,800 bytes. <code>If-Modified-Since<\/code> with the Last-Modified date also returned 304. Then we added one line to the stylesheet and sent the old ETag again:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP\/1.1 200 OK\nContent-Length: 6819\nLast-Modified: Wed, 30 Sep 2026 06:21:29 GMT\nETag: \"6abcaa69-1aa3\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The ETag changed, so the server sent the whole new file. nginx builds the ETag for a static file from its modification time and size in hexadecimal (<code>1a90<\/code> is 6800, <code>1aa3<\/code> is 6819). Apache does much the same: the <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/mod\/core.html#fileetag\" target=\"_blank\" rel=\"noopener noreferrer\">FileETag<\/a> default is <code>MTime Size<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where you see 304 responses<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Access logs.<\/strong> Lines with status 304 and a response size of 0 or close to it are repeat visitors whose browsers checked their cache. That is good news, not an error to fix.<\/li>\n\n\n\n<li><strong>Browser developer tools.<\/strong> The Network panel shows 304 for revalidated files. MDN&#8217;s <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Status\/304\" target=\"_blank\" rel=\"noopener noreferrer\">304 reference<\/a> notes that the network panels of many developer tools create extra requests that lead to 304 responses, so you may see more of them there than real visitors cause.<\/li>\n\n\n\n<li><strong>Search engine crawling.<\/strong> Google&#8217;s <a href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/overview-google-crawlers\" target=\"_blank\" rel=\"noopener noreferrer\">crawler documentation<\/a> says its crawling infrastructure supports both ETag with If-None-Match and Last-Modified with If-Modified-Since. It recommends ETag because it has no date formatting issues, and suggests setting both.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">When a 304 is a problem, and how to fix it<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Visitors still see the old version<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A correct 304 never serves stale content: if the file changed, the validator changes and the server sends a 200. When people see an old stylesheet or page, the cause is usually that the browser did not ask at all. With <code>Cache-Control: max-age=N<\/code>, <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Headers\/Cache-Control\" target=\"_blank\" rel=\"noopener noreferrer\">MDN<\/a> explains, the response stays fresh for N seconds, and a fresh copy is used without contacting the server. Fixes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Put a version in the file name or URL of CSS and JavaScript (<code>style.css?v=2<\/code> or <code>style.2.css<\/code>) when you change it. A new URL is a new cache entry.<\/li>\n\n\n\n<li>For HTML that changes often, send <code>Cache-Control: no-cache<\/code>. MDN defines it as: the response can be stored, but must be validated with the origin server before each reuse. That is exactly the 304 check.<\/li>\n\n\n\n<li>Use <code>no-store<\/code> only for pages that must never be kept, such as account pages. It stops caching and 304s altogether.<\/li>\n\n\n\n<li>To check your own browser, <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9303\/How-to-Clear-Your-Browser-Cache-Chrome-Safari-Firefox-Edge-iPhone-and-Android.html\">clear the browser cache<\/a> or open the page in a private window.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">You never get a 304<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If every repeat request returns a full 200, one of these is usually the reason:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The page is dynamic.<\/strong> PHP, WordPress and other applications build the page on each request and do not send an ETag or Last-Modified unless the application or a caching plugin adds them. A static file gets validators from the web server; a script does not.<\/li>\n\n\n\n<li><strong>Validators are switched off.<\/strong> In nginx, <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_core_module.html\" target=\"_blank\" rel=\"noopener noreferrer\"><code>etag off;<\/code><\/a> removes the ETag and <code>if_modified_since off;<\/code> makes nginx treat every response as modified. We tested both: with <code>etag off<\/code> the If-Modified-Since check still gave a 304; with both off, every request returned 200.<\/li>\n\n\n\n<li><strong>The ETag differs between servers.<\/strong> Because the ETag comes from the file&#8217;s modification time, two load-balanced servers holding the same file with different timestamps give different ETags, and a request that reaches the other server gets a 200. Deploy so that timestamps match, or rely on Last-Modified.<\/li>\n\n\n\n<li><strong>Compression or a CDN changed the ETag.<\/strong> With <code>gzip on<\/code>, our nginx sent <code>ETag: W\/\"6abcaa5d-1a90\"<\/code>, a weak ETag, for the compressed version. Sending that weak value back still returned 304, so this is normal. Cloudflare&#8217;s <a href=\"https:\/\/developers.cloudflare.com\/cache\/reference\/etag-headers\/\" target=\"_blank\" rel=\"noopener noreferrer\">ETag documentation<\/a> says it either converts strong ETags to weak ones or removes them, unless you turn on &#8220;Respect Strong ETags&#8221;, and that it removes an ETag that is not in the correct double-quoted format.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Adding 304 support to a dynamic page<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For an API response or a report that is expensive to send but cheap to fingerprint, you can answer 304 yourself. This PHP example makes an ETag from the content and compares it with the one the client sent:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n$body  = \"Stock report: 42 items\\n\";          \/\/ normally built from the database\n$etag  = '\"' . md5($body) . '\"';\nheader('ETag: ' . $etag);\nheader('Cache-Control: no-cache');            \/\/ store it, but check with the server first\nif (trim($_SERVER['HTTP_IF_NONE_MATCH'] ?? '') === $etag) {\n    http_response_code(304);                  \/\/ headers only, no body\n    exit;\n}\necho $body;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With PHP 8.3.33&#8217;s built-in server, the first request returned 200 with the report and <code>ETag: \"fe4f248f88a93b929ccdbec997504946\"<\/code>; the same request with that value in <code>If-None-Match<\/code> returned <code>HTTP\/1.1 304 Not Modified<\/code> and no body. Two notes: this still builds the page, so it saves bandwidth rather than server time, and a production version should also accept a list of ETags and the <code>*<\/code> value that RFC 9110 allows in If-None-Match.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">304 compared with other 3xx codes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">304 sits in the 3xx &#8220;redirection&#8221; class, but it does not send the visitor anywhere. RFC 9110 describes it as redirecting the client to its own stored copy. Real redirects such as 301 and 302 send the client to a different URL with a Location header; see <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/9298\/What-Is-a-302-Redirect-302-Found-vs-301-307-and-308.html\">302 Found vs 301, 307 and 308<\/a> if that is what you need.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In short, a 304 in your logs means caching is working. Set sensible Cache-Control headers, version your CSS and JavaScript files, and check validators with <code>curl -I<\/code> when something looks wrong. If you want full control over nginx or Apache headers, a <a href=\"https:\/\/www.ucartz.com\/kvm-vps\">KVM VPS<\/a> gives you root access to the server configuration. For WordPress on shared hosting, a page cache such as <a href=\"https:\/\/www.ucartz.com\/clients\/knowledgebase\/568\/How-to-Speed-Up-WordPress-with-LiteSpeed-Cache.html\">LiteSpeed Cache<\/a> is the bigger win, because it saves PHP from building the page at all.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.<\/p>\n","protected":false},"author":5,"featured_media":4264,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[389,83],"tags":[1129,1130,1127,1125,1131,1128,190,1126],"class_list":["post-4263","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","category-website-development","tag-browser-cache","tag-cache-control","tag-etag","tag-http-304","tag-http-status-codes","tag-if-none-match","tag-nginx","tag-not-modified"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HTTP 304 Not Modified: What It Means and When It\u2026 | Ucartz<\/title>\n<meta name=\"description\" content=\"What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"| Ucartz Blog | Ucartz\" \/>\n<meta property=\"og:description\" content=\"What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/\" \/>\n<meta property=\"og:site_name\" content=\"Ucartz Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/UcartzOnline\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-04T11:05:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-09T22:05:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ashily Shaji\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"| Ucartz Blog | Ucartz\" \/>\n<meta name=\"twitter:creator\" content=\"@ucartz\" \/>\n<meta name=\"twitter:site\" content=\"@ucartz\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ashily Shaji\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/\"},\"author\":{\"name\":\"Ashily Shaji\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/person\\\/ed6b098cc94c224512e124471f674d69\"},\"headline\":\"HTTP 304 Not Modified: What It Means and When It Is a Problem\",\"datePublished\":\"2026-11-04T11:05:00+00:00\",\"dateModified\":\"2026-11-09T22:05:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/\"},\"wordCount\":1097,\"publisher\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/http-304-not-modified.jpg\",\"keywords\":[\"browser cache\",\"cache-control\",\"etag\",\"http 304\",\"http status codes\",\"if-none-match\",\"Nginx\",\"not modified\"],\"articleSection\":[\"Server\",\"Website Development\"],\"inLanguage\":\"en-US\"},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/\",\"name\":\"| Ucartz Blog | Ucartz\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/http-304-not-modified.jpg\",\"datePublished\":\"2026-11-04T11:05:00+00:00\",\"dateModified\":\"2026-11-09T22:05:02+00:00\",\"description\":\"What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/\"]}]},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/http-304-not-modified.jpg\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/http-304-not-modified.jpg\",\"width\":1200,\"height\":630,\"caption\":\"HTTP 304 Not Modified: What It Means and When It Is a Problem\"},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/http-304-not-modified\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTTP 304 Not Modified: What It Means and When It Is a Problem\"}]},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\",\"name\":\"Ucartz Blog\",\"description\":\"Guides on hosting, servers, streaming and automation\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#organization\"},\"alternateName\":\"Ucartz\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#organization\",\"name\":\"Ucartz Online Private Limited\",\"alternateName\":\"Ucartz\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/assets\\\/images\\\/brand\\\/logo\\\/ucartz-logo-888x240.png\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/assets\\\/images\\\/brand\\\/logo\\\/ucartz-logo-888x240.png\",\"width\":888,\"height\":240,\"caption\":\"Ucartz\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/UcartzOnline\",\"https:\\\/\\\/twitter.com\\\/ucartz\",\"https:\\\/\\\/www.instagram.com\\\/ucartz_com\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/ucartzonline\",\"https:\\\/\\\/github.com\\\/ucartz\",\"https:\\\/\\\/n8n.io\\\/creators\\\/ucartz\\\/\",\"https:\\\/\\\/marketplace.whmcs.com\\\/group\\\/Ucartz\"]},{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/person\\\/ed6b098cc94c224512e124471f674d69\",\"name\":\"Ashily Shaji\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/themes\\\/ucartz-blog\\\/assets\\\/images\\\/authors\\\/ashily-112.webp\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/themes\\\/ucartz-blog\\\/assets\\\/images\\\/authors\\\/ashily-112.webp\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/themes\\\/ucartz-blog\\\/assets\\\/images\\\/authors\\\/ashily-112.webp\",\"caption\":\"Ashily Shaji\"},\"sameAs\":[\"https:\\\/\\\/www.ucartz.com\\\/\"],\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/author\\\/ashily\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HTTP 304 Not Modified: What It Means and When It\u2026 | Ucartz","description":"What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/","og_locale":"en_US","og_type":"article","og_title":"| Ucartz Blog | Ucartz","og_description":"What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.","og_url":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/","og_site_name":"Ucartz Blog","article_publisher":"https:\/\/www.facebook.com\/UcartzOnline","article_published_time":"2026-11-04T11:05:00+00:00","article_modified_time":"2026-11-09T22:05:02+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified.jpg","type":"image\/jpeg"}],"author":"Ashily Shaji","twitter_card":"summary_large_image","twitter_title":"| Ucartz Blog | Ucartz","twitter_creator":"@ucartz","twitter_site":"@ucartz","twitter_misc":{"Written by":"Ashily Shaji","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@context":"https:\/\/schema.org","@type":"Article","@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#article","isPartOf":{"@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/"},"author":{"name":"Ashily Shaji","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/person\/ed6b098cc94c224512e124471f674d69"},"headline":"HTTP 304 Not Modified: What It Means and When It Is a Problem","datePublished":"2026-11-04T11:05:00+00:00","dateModified":"2026-11-09T22:05:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/"},"wordCount":1097,"publisher":{"@id":"https:\/\/www.ucartz.com\/#organization"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified.jpg","keywords":["browser cache","cache-control","etag","http 304","http status codes","if-none-match","Nginx","not modified"],"articleSection":["Server","Website Development"],"inLanguage":"en-US"},{"@context":"https:\/\/schema.org","@type":"WebPage","@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/","url":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/","name":"| Ucartz Blog | Ucartz","isPartOf":{"@id":"https:\/\/www.ucartz.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#primaryimage"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified.jpg","datePublished":"2026-11-04T11:05:00+00:00","dateModified":"2026-11-09T22:05:02+00:00","description":"What the HTTP 304 Not Modified status means, how ETag and If-Modified-Since trigger it, tested nginx examples, and what to do when caching goes wrong.","breadcrumb":{"@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/"]}]},{"@context":"https:\/\/schema.org","@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#primaryimage","url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified.jpg","contentUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/11\/http-304-not-modified.jpg","width":1200,"height":630,"caption":"HTTP 304 Not Modified: What It Means and When It Is a Problem"},{"@context":"https:\/\/schema.org","@type":"BreadcrumbList","@id":"https:\/\/www.ucartz.com\/blog\/http-304-not-modified\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ucartz.com\/blog\/"},{"@type":"ListItem","position":2,"name":"HTTP 304 Not Modified: What It Means and When It Is a Problem"}]},{"@context":"https:\/\/schema.org","@type":"WebSite","@id":"https:\/\/www.ucartz.com\/blog\/#website","url":"https:\/\/www.ucartz.com\/blog\/","name":"Ucartz Blog","description":"Guides on hosting, servers, streaming and automation","publisher":{"@id":"https:\/\/www.ucartz.com\/#organization"},"alternateName":"Ucartz","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ucartz.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@context":"https:\/\/schema.org","@type":"Organization","@id":"https:\/\/www.ucartz.com\/#organization","name":"Ucartz Online Private Limited","alternateName":"Ucartz","url":"https:\/\/www.ucartz.com\/","logo":{"@type":"ImageObject","@id":"https:\/\/www.ucartz.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.ucartz.com\/assets\/images\/brand\/logo\/ucartz-logo-888x240.png","contentUrl":"https:\/\/www.ucartz.com\/assets\/images\/brand\/logo\/ucartz-logo-888x240.png","width":888,"height":240,"caption":"Ucartz"},"image":{"@id":"https:\/\/www.ucartz.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/UcartzOnline","https:\/\/twitter.com\/ucartz","https:\/\/www.instagram.com\/ucartz_com","https:\/\/www.linkedin.com\/company\/ucartzonline","https:\/\/github.com\/ucartz","https:\/\/n8n.io\/creators\/ucartz\/","https:\/\/marketplace.whmcs.com\/group\/Ucartz"]},{"@context":"https:\/\/schema.org","@type":"Person","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/person\/ed6b098cc94c224512e124471f674d69","name":"Ashily Shaji","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ucartz.com\/blog\/wp-content\/themes\/ucartz-blog\/assets\/images\/authors\/ashily-112.webp","url":"https:\/\/www.ucartz.com\/blog\/wp-content\/themes\/ucartz-blog\/assets\/images\/authors\/ashily-112.webp","contentUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/themes\/ucartz-blog\/assets\/images\/authors\/ashily-112.webp","caption":"Ashily Shaji"},"sameAs":["https:\/\/www.ucartz.com\/"],"url":"https:\/\/www.ucartz.com\/blog\/author\/ashily\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/4263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/comments?post=4263"}],"version-history":[{"count":1,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/4263\/revisions"}],"predecessor-version":[{"id":4266,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/4263\/revisions\/4266"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/media\/4264"}],"wp:attachment":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/media?parent=4263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/categories?post=4263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/tags?post=4263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}