{"id":1476,"date":"2026-11-02T18:00:00","date_gmt":"2026-11-02T18:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1476"},"modified":"2026-11-02T18:00:00","modified_gmt":"2026-11-02T18:00:00","slug":"http-304-means-the-cached-copy-is-still-useful","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/","title":{"rendered":"HTTP 304 Means the Cached Copy Is Still Useful"},"content":{"rendered":"<p>An HTTP 304 response is supposed to arrive without a response body. It tells the client that the representation it already has is still valid, so sending the same content again would be unnecessary. If your debugging tool shows an empty body beside 304, that alone does not mean the server forgot to render the page.<\/p>\n<p>The <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Reference\/Status\/304\">MDN reference<\/a> explains the conditional request behind it. A client can send a validator such as If-None-Match, and the server can confirm that the cached representation remains usable. That is a different conversation from an ordinary request for a fresh body.<\/p>\n<p>When investigating confusing caching behaviour, I would look at both sides: the request&#8217;s conditional headers, the response headers and the cached copy the client is using. Testing with a cache disabled can help isolate the issue, but it changes the conditions. It does not prove that the normal caching path behaves correctly.<\/p>\n<p>The useful question is whether the user sees the right representation under the intended caching rules. Returning 200 for everything might make a network panel look simpler while throwing away perfectly good caching. Understand the exchange first, then change the part that is actually giving the wrong answer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>An HTTP 304 response is supposed to arrive without a response body.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13],"tags":[272,306,307],"class_list":["post-1476","post","type-post","status-publish","format-standard","hentry","category-programming","tag-caching","tag-http","tag-web-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>HTTP 304 Means the Cached Copy Is Still Useful - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTTP 304 Means the Cached Copy Is Still Useful - wade.one\" \/>\n<meta property=\"og:description\" content=\"An HTTP 304 response is supposed to arrive without a response body.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-02T18:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"HTTP 304 Means the Cached Copy Is Still Useful\",\"datePublished\":\"2026-11-02T18:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/\"},\"wordCount\":204,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"caching\",\"http\",\"web-performance\"],\"articleSection\":[\"Programming\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/\",\"name\":\"HTTP 304 Means the Cached Copy Is Still Useful - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-11-02T18:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/11\\\/02\\\/http-304-means-the-cached-copy-is-still-useful\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTTP 304 Means the Cached Copy Is Still Useful\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"HTTP 304 Means the Cached Copy Is Still Useful - wade.one","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:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/","og_locale":"en_GB","og_type":"article","og_title":"HTTP 304 Means the Cached Copy Is Still Useful - wade.one","og_description":"An HTTP 304 response is supposed to arrive without a response body.","og_url":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/","og_site_name":"wade.one","article_published_time":"2026-11-02T18:00:00+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/"},"author":{"name":"","@id":""},"headline":"HTTP 304 Means the Cached Copy Is Still Useful","datePublished":"2026-11-02T18:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/"},"wordCount":204,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["caching","http","web-performance"],"articleSection":["Programming"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/","url":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/","name":"HTTP 304 Means the Cached Copy Is Still Useful - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-11-02T18:00:00+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/11\/02\/http-304-means-the-cached-copy-is-still-useful\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"HTTP 304 Means the Cached Copy Is Still Useful"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}}]}},"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":206,"url":"https:\/\/wade.one\/blog\/2009\/10\/10\/phpnw-09-food-and-optimising-front-end-performance\/","url_meta":{"origin":1476,"position":0},"title":"PHPNW 09 &#8211; Food and Optimising front end performance","author":"Wade","date":"October 10, 2009","format":false,"excerpt":"So lunch was 'so-so' - the dauphinoise were undercooked,\u00a0 the duck sauce was too strong and overpowered the duck (probably good as they were rather cheap legs.) \"Optimising your front end performance\" was a very mixed talk. There were some generalisations that were seriously poor such as \"80% of access\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1440,"url":"https:\/\/wade.one\/blog\/2026\/10\/21\/hashed-asset-names-make-cdn-releases-easier-to-reason-about\/","url_meta":{"origin":1476,"position":1},"title":"Hashed Asset Names Make CDN Releases Easier to Reason About","author":"Wade","date":"October 21, 2026","format":false,"excerpt":"Replacing app.js and hoping every cache forgets the old version is a fairly unpleasant deployment strategy.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":556,"url":"https:\/\/wade.one\/blog\/2011\/04\/25\/automating-implemented-methods-for-a-web-based-api\/","url_meta":{"origin":1476,"position":2},"title":"Automating &#8220;Implemented methods&#8221; for a web based API","author":"Wade","date":"April 25, 2011","format":false,"excerpt":"In my leedsphp talk last week I mentioned making a developer (and consumers) life easier by automatically implementing the allow methods functionality that your API may expose (e.g. you call PUT on a URL that only allows GET or POST). I did have an example slide there showing how to\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1394,"url":"https:\/\/wade.one\/blog\/2026\/08\/15\/mcp-going-stateless-is-the-boring-fix-it-needed\/","url_meta":{"origin":1476,"position":3},"title":"MCP Going Stateless Is the Boring Fix It Needed","author":"Wade","date":"August 15, 2026","format":false,"excerpt":"MCP's stateless core removes deployment plumbing that should never have been the interesting part of an agent tool.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1172,"url":"https:\/\/wade.one\/blog\/2026\/04\/05\/what-makes-an-api-feel-nice-to-work-with\/","url_meta":{"origin":1476,"position":4},"title":"What Makes an API Feel Nice to Work With","author":"","date":"April 5, 2026","format":false,"excerpt":"A good API is not just functional. It is predictable, consistent, and easy to use without a lot of guesswork.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1470,"url":"https:\/\/wade.one\/blog\/2026\/10\/27\/verify-webhook-signatures-before-parsing-away-the-evidence\/","url_meta":{"origin":1476,"position":5},"title":"Verify Webhook Signatures Before Parsing Away the Evidence","author":"","date":"October 27, 2026","format":false,"excerpt":"A webhook can contain perfectly sensible JSON and still fail signature verification.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1476"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1476\/revisions"}],"predecessor-version":[{"id":1490,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1476\/revisions\/1490"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}