demo · v141
UTM Collapse
Hit the same image with three different tracking-parameter combinations. Without No-Vary-Search, each URL is a distinct disk-cache entry — three full byte transfers. With the response header set, all three resolve to one cache entry. Watch the bytes column collapse.
Heads up
Requires Chrome 141+. The header on the response (not the request) declares which params don't affect content. Older browsers ignore it and fall back to cache-per-URL. The server side of this demo is mocked through the Cache API for portability — production servers send
No-Vary-Search: params=("utm_source" "utm_medium" "fbclid").
checking support…
no requests yet
the header on the response
HTTP/2 200
Content-Type: image/png
Cache-Control: max-age=3600
No-Vary-Search: params=("utm_source" "utm_medium" "utm_campaign" "fbclid" "gclid")
<…bytes…>
// Variant: ignore EVERY param except a known list (key-order doesn't matter either)
No-Vary-Search: key-order, except=("v")
why this angle
The WICG nav-speculation explainer's leading example is tracking params. CMS-driven sites typically send heroes / hero variants tagged with utm_* across every social campaign, attaching fbclid and gclid automatically from ad clicks. Without No-Vary-Search the same byte-identical asset is fetched 5-20 times across a single session. The header is one line in the response and saves real bandwidth — for the user on data caps, and for the publisher's CDN bill.