Skip to content

Cache conflicts

Image Rotation sends aggressive no-cache headers, but a CDN or caching plugin can still pin a stale image. Here is how to detect and resolve.

What we send

Every image response carries:

Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff

Compliant clients (browsers, Outlook, ConnectWise) honor these and never cache the image.

Caching layers that can override

  • Cloudflare with "Cache Everything" page rules will cache despite no-store. Add a Cloudflare Page Rule for your image URL pattern (*example.com/image-rotate/*) with Cache Level: Bypass.
  • WP Rocket caches output by default. Add the URL pattern to Never Cache URLs.
  • W3 Total Cache — same. Add the pattern to Performance → Page Cache → Advanced → Never cache the following pages.
  • Server-side caches (Varnish, nginx proxy_cache) — add a bypass rule for the URL pattern.

How to detect

Open the image URL in a browser, view the response headers in DevTools → Network. Look for the cf-cache-status header (Cloudflare) or x-cache headers (other CDNs). If you see HIT, the image is being cached upstream.

Verify the fix

After adding the bypass rule, hit the URL twice. Both responses should show cf-cache-status: BYPASS (or MISS), and the timestamps in the response body should match "right now."