Pragma: no-cache header (tested)
Pragma: no-cache is the HTTP/1.0 way to say "do not serve this from a cache without checking". Cache-Control replaced it in HTTP/1.1, and RFC 9111 now calls Pragma deprecated. It is still everywhere, so we measured what Chromium 153 actually does with it on responses and when it sends it on requests.
1. Response side: does Pragma alone stop caching? (measured)
A Node.js server returned each URL below. The page called fetch(url) three times in a row for each URL and the server counted requests. 1 hit means the browser reused its cached copy; 3 hits means it went back every time.
| Response headers | Server hits (of 3) | What happened |
|---|---|---|
Cache-Control: max-age=60 | 1 | Cached, as expected (control) |
Last-Modified (10 days old), nothing else | 1 | Cached heuristically (control) |
Pragma: no-cache + Last-Modified | 3 | Revalidated every time: requests 2 and 3 carried If-Modified-Since |
Pragma: no-cache + Expires (1 hour ahead) | 3 | Not reused |
Pragma: no-cache + Cache-Control: max-age=60 | 3 | Not reused: Pragma won over max-age |
So in Chromium 153, a response Pragma: no-cache behaves like Cache-Control: no-cache: the copy may be stored but must be revalidated before reuse. Our test server always answered 200, so you only see the saving of a 304 if your server supports conditional requests.
The last row is the surprise. RFC 9111 (section 5.4) says Pragma is deprecated and RFC 7234 said caches should ignore it when Cache-Control is present (from the RFC, not measured). Chromium did not ignore it. Do not rely on either behaviour: if a response is cacheable, do not also send Pragma: no-cache, because some framework default may be quietly disabling your caching.
# find it in your own responses
curl -sI https://example.com/app.js | grep -iE '^(pragma|cache-control|expires)'
2. Request side: when does Chromium send Pragma? (measured)
We logged the request headers Chromium 153 sent to the test server:
| Action | Pragma | Cache-Control |
|---|---|---|
First page load / plain fetch(url) | none | none |
| Normal reload | none | max-age=0 |
| Hard reload (ignore cache) | no-cache | no-cache |
fetch(url, {cache: 'no-store'}) | no-cache | no-cache |
fetch(url, {cache: 'reload'}) | no-cache | no-cache |
fetch(url, {cache: 'no-cache'}) | none | max-age=0 |
Chromium sends both headers together whenever it wants an end-to-end fresh copy. The Pragma copy is for old HTTP/1.0 proxies that do not understand Cache-Control. Note that fetch mode no-cache sends max-age=0, not no-cache: the names do not match the headers.
If your server or CDN logs show Pragma: no-cache on requests, it usually means a hard reload or a script using cache: 'reload' or 'no-store', not a misconfigured client.
3. curl: it is just a header (measured)
curl -sv -o /dev/null -H 'Pragma: no-cache' http://127.0.0.1:8988/ 2>&1 | grep -i '^> pragma'
> Pragma: no-cache
curl 8.14.1 has no HTTP cache, so the header changes nothing on the client side. It sent the header on both requests and got 200 both times; without -H curl sent no Pragma at all. The only effect is on whatever cache sits between you and the origin (a CDN or proxy), and many CDNs ignore request Pragma and request Cache-Control by default (from vendor docs, not measured).
4. Pragma vs Cache-Control (from the RFC, not measured)
Pragma: no-cache | Cache-Control | |
|---|---|---|
| Defined in | HTTP/1.0; deprecated in RFC 9111 | RFC 9111 (HTTP/1.1 and later) |
| Values | Only no-cache is standard | no-cache, no-store, max-age, private, public and more |
| Meant for | Requests (the spec never defined its meaning on responses) | Requests and responses |
| Chromium 153 on responses | Treated like no-cache (measured above) | Followed |
To stop caching, use the header that says what you mean. See no-cache vs no-store (revalidate vs never store) and private vs public (browser only vs shared caches).
5. What to send
- Sensitive or never-cache response:
Cache-Control: no-store. AddingPragma: no-cacheis harmless and only helps HTTP/1.0 caches, which are rare. - Always revalidate:
Cache-Control: no-cacheplus anETagorLast-Modifiedso you get cheap 304s. - Cacheable response: make sure no
Pragma: no-cachesneaks in. In our test it cancelledmax-age=60completely.
Paste a URL into the HTTP header checker to see which of these your server actually sends.
Frequently asked questions
What does Pragma: no-cache do?
It is the HTTP/1.0 way to ask that a cached copy not be used without checking the server. In Chromium 153 we measured that a response with <code>Pragma: no-cache</code> was revalidated on every fetch, just like <code>Cache-Control: no-cache</code>.
Does Pragma: no-cache override Cache-Control: max-age?
In Chromium 153, yes: a response with both <code>Cache-Control: max-age=60</code> and <code>Pragma: no-cache</code> hit the server 3 times out of 3 fetches. The older RFC 7234 said Cache-Control should win, so other caches may differ. Do not send both.
Is the Pragma header deprecated?
Yes. RFC 9111 marks Pragma as deprecated and says to use Cache-Control instead (from the RFC, not measured). Browsers still send it on hard reloads for old proxies.
Why do my logs show Pragma: no-cache requests?
Chromium 153 sent <code>Pragma: no-cache</code> and <code>Cache-Control: no-cache</code> on a hard reload and on <code>fetch()</code> with <code>cache: 'reload'</code> or <code>'no-store'</code>. A normal reload sent only <code>Cache-Control: max-age=0</code>.
Does curl -H 'Pragma: no-cache' bypass a cache?
Not on your machine: curl has no cache, so it just adds the header. A CDN or proxy in the path may or may not honour it; many ignore client cache headers by default.
Written with AI assistance. Measured on 2026-10-02 with headless Chromium 153.0.8010.12 (Playwright) against a Node.js test server on localhost:8987, counting server hits for 3 identical fetch() calls per URL and logging request headers for fetch() cache modes, a normal reload and a hard reload (DevTools Page.reload ignoreCache). curl 8.14.1 against a local python http.server on 127.0.0.1:8988. Pragma and Cache-Control semantics are quoted from RFC 9111 and RFC 7234, not measured. Firefox and Safari were not tested. PlainHeaders is our extension; curl, Node.js and Playwright are free.