Vercel Image CDN doesn't return a proper status code for range requests. In my app, sometimes Chrome do range requests for images when connection is slow and content changes (e.g. on navigations). Chrome first stores partial response as truncated cache entry and then the exact image is requested, it does a range request via Range and If-Range headers. Vercel properly handles those headers but, for some reason, returns 200 status code instead of 206 and because of that Chrome stores an empty response on its disk cache and restores it on subsequent visits.
Here is an example of response for curl:
curl -i -H 'Range: bytes=12000-12000' -H 'If-Range: Mon, 15 Jun 2026 14:31:00 GMT' 'https://staging-app.playbook-kw.com/_next/image?url=https%3A%2F%2Fstaging-api.playbook-kw.com%2Frails%2Factive_storage%2Fblobs%2Fredirect%2FeyJfcmFpbHMiOnsiZGF0YSI6MzA2LCJwdXIiOiJibG9iX2lkIn19--20ccbd94aa6c886d88de0d03119080348adf307c%2Fgabriela-wasiewicz-cover.jpg&w=1920&q=85'HTTP/2 200 age: 2836389cache-control: public, max-age=31536000, must-revalidatecontent-disposition: attachment; filename="gabriela-wasiewicz-cover.jpg"content-range: bytes 12000-12000/252693content-security-policy: script-src 'none'; frame-src 'none'; sandbox;content-type: image/jpegdate: Thu, 13 Aug 2026 00:29:01 GMTlast-modified: Mon, 15 Jun 2026 14:30:00 GMTserver: Vercelstrict-transport-security: max-age=63072000vary: Acceptx-vercel-cache: HITx-vercel-id: fra1::s8fw7-1789417331576-12beb0976691content-length: 1As you can see it returns 200 status code for content-length: 1.
Here is another example where it doesn't hit cache on CDN:
curl -i -H 'Range: bytes=12000-12000' -H 'If-Range: Mon, 15 Jun 2026 14:30:00 GMT' 'https://staging-app.playbook-kw.com/_next/image?url=https%3A%2F%2Fstaging-api.playbook-kw.com%2Frails%2Factive_storage%2Fblobs%2Fredirect%2FeyJfcmFpbHMiOnsiZGF0YSI6MzA2LCJwdXIiOiJibG9iX2lkIn19--20ccbd94aa6c886d88de0d03119080348adf307c%2Fgabriela-wasiewicz-cover.jpg&w=1920&q=80'HTTP/2 200 age: 0cache-control: public, max-age=31536000, must-revalidatecontent-disposition: attachment; filename="gabriela-wasiewicz-cover.jpg"content-range: bytes 12000-12000/202870content-security-policy: script-src 'none'; frame-src 'none'; sandbox;content-type: image/jpegdate: Mon, 14 Sep 2026 20:22:49 GMTlast-modified: Mon, 15 Jun 2026 14:30:00 GMTserver: Vercelstrict-transport-security: max-age=63072000vary: Acceptx-vercel-cache: MISSx-vercel-id: fra1::6hcdh-1789417369461-bf67c5aca929content-length: 1