Direct answer: none of the 36 article pages can be cached from its response headers: 31 send no-store, one sends private, and four have no Cache-Control at all; no page declares a positive max-age. ETag appears on three pages, Last-Modified on none, while Vary appears on 35.
All pages return 200 with text/html. The issue is not the absence of headers but their direction: no-store tells browsers and shared caches to keep no copy, so every visit fetches the HTML again.
Method: one header snapshot, HEAD then GET
The study re-requests the response headers of the 36 article URLs cached in study 45 (10 sites, HTTP 200, HTML ≥5 KB): HEAD first, then GET if HEAD fails, returns non-2xx or lacks Content-Type. Only headers are read; bodies are not stored. Requests are 0.5 s apart, one snapshot on 2026-11-06 13:42–13:44.
| Item | Rule | Boundary |
|---|---|---|
| Cacheable | max-age or s-maxage > 0 | CDN edge policy not checked |
| no-store | Cache-Control contains no-store | Does not prove the CDN ignores it |
| Validator | ETag or Last-Modified present | 304 behaviour not tested |
| Compression | HEAD often omits Content-Encoding | No compression claim here |
Result: no-store dominates
| Header | Pages | Share of 36 |
|---|---|---|
Cache-Control present | 32 | 88.9% |
of which no-store | 31 | 86.1% |
of which private | 1 | 2.8% |
No Cache-Control | 4 | 11.1% |
Positive max-age / s-maxage | 0 | 0% |
ETag | 3 | 8.3% |
Last-Modified | 0 | 0% |
Vary | 35 | 97.2% |
Age | 2 | 5.6% |
By site: eight sites all send no-store
| Site | Pages | Cache-Control | ETag | Vary |
|---|---|---|---|---|
| E03 / E06 / E09 / E14 | 5 each | all no-store | 0 | all |
| E22 / E23 | 5 each | all no-store | 0 | all |
| E28 | 1 | no-store | 0 | none |
| E26 | 1 | private | 0 | yes |
| E16 | 3 | none | 3 | yes |
| E19 | 1 | none | 0 | yes |
Every article page on a site shares the same policy, so this is a server or CMS-wide setting rather than a per-page choice. E16 is the only site using ETag (three pages) but it has no Cache-Control; E19 has neither and only sends Vary.
Compared with the homepage cache pilot
| Measure | Homepages (study 49, 25) | Articles (this study, 36) |
|---|---|---|
| Positive max-age | 1 | 0 |
| no-store | 8 | 31 |
| No Cache-Control | 8 | 4 |
| ETag | 4 | 3 |
| Last-Modified | 4 | 0 |
| Vary | 22 | 35 |
Article pages switch caching off more aggressively: no-store rises from 8 of 25 to 31 of 36, and not one page sends Last-Modified. The two samples cover different sites, so this is a side-by-side comparison only.
What this means for acceptance
- Make article caching an acceptance item. None of 36 pages has a positive
max-age; a 5–60 minute browser cache for static articles is a reasonable ask. - Separate news feeds from article pages.
no-storemay come from a site-wide default; article pages can be relaxed on their own. - Provide a validator. Only three pages send
ETagand none sendsLast-Modified, so 304 revalidation is impossible. - Vary is already common. 35 of 36 pages send it; nothing to change there.
- Test compression separately. HEAD often omits
Content-Encoding, so this study makes no compression claim.
Limits
- One snapshot: headers captured on 2026-11-06 13:42–13:44 may change with the CDN.
- HEAD limits: some headers (such as
Content-Encoding) are missing in HEAD and were not used for conclusions. - No 304 test: an ETag does not prove the server answers conditional requests correctly.
- CDN not inspected: origin headers and edge policy can differ.
- 10 sites, 36 pages: a pilot, no industry claim.
Data and reproduction
Anonymised data: equipment-article-cache-headers-2026.csv (36 rows × 18 columns: status, content type, parsed Cache-Control, max-age, ETag/Last-Modified/Vary/Age, the raw Cache-Control and any error). The repository keeps docs/research/2026-11-article-cache-headers.csv.
Parser: scripts/article_cache_header_probe.py; unit tests: scripts/test_article_cache_header_probe.py (no network, nine tests). Run:
python -m unittest scripts.test_article_cache_header_probe
Related: the homepage cache and compression pilot, the homepage security-header pilot, and the 48-hour header recheck.
Sources and definitions
- URLs: 36 article pages from study 45 (10 sites), HTTP 200, HTML ≥5 KB.
- Requests: HEAD first, GET on failure; headers only, 0.5 s apart.
- Time: 2026-11-06 13:42–13:44.