No-Vary-Search Header Checker
Validate a No-Vary-Search header against the current IETF draft and Chrome, or paste a link to get a suggested header.
Input: No-Vary-Search header value. The "No-Vary-Search:" prefix is optional.
Input: Or start from a link: paste a URL from an email, ad or campaign and get a suggested header.
Output: Result
| Draft (IETF -10) | valid | |
|---|---|---|
| Chrome | works |
Where it applies
| Chrome HTTP cache | applies | |
|---|---|---|
| Chrome prefetch and prerender | applies | Repeat the header as expects_no_vary_search in your speculation rules. |
| Caches that follow the draft | applies | |
| CDNs and proxies | depends | Many build their cache key from the full query string. Set their query-string cache key to match. |
| Firefox and Safari | unconfirmed | See browser support |
Effective behaviour
- These parameters are ignored: "utm_source", "utm_medium", "utm_campaign", "gclid", "fbclid". All other parameters must match.
- Parameter order does not count.
- The query is parsed and decoded before comparing, so ?a=%61 matches ?a=a, + matches %20, and empty pairs (&&) are dropped.
Conventional form
No-Vary-Search: key-order, params=("utm_source" "utm_medium" "utm_campaign" "gclid" "fbclid")Works in both the draft and Chrome.
What is No-Vary-Search?
No-Vary-Search is an HTTP response header. It tells caches (the browser HTTP cache, prefetch and prerender) which query parameters don't change the response. For example, /page?utm_source=x can then reuse the cached /page. This site sends one too: see how it works here.
Heads-up: the draft and Chrome disagree. Chrome (and MDN) use
params for "ignore all" and params, except=(…) for "ignore all except". The current draft makes both invalid and writes except=() and except=(…) instead, which Chrome ignores. key-order and params=(…) lists work in both. The checker shows both verdicts. Read more in the guide →Examples
| Header | What it does | Draft | Chrome |
|---|---|---|---|
key-order |
Parameter order doesn't matter | valid | works |
params=("utm_source" "fbclid") |
Ignore these parameters | valid | works |
key-order, params=("utm_source") |
Both combined | valid | works |
except=("id") |
Ignore every parameter except id (draft form) | valid | ignored |
params, except=("id") |
Ignore every parameter except id (Chrome form) | invalid | works |
except=() |
Ignore all parameters (draft form) | valid | ignored |
params |
Ignore all parameters (Chrome form) | invalid | works |
params=("a", "b") |
Broken: list items are separated by spaces, not commas | invalid | ignored |
params=(utm_source) |
Broken: parameter names must be quoted strings | invalid | ignored |
Read the full guide → How caches match URLs, safe and unsafe parameters, recipes and troubleshooting.