直接答案:25 个首页中,只有 1 个用正 max-age 明确允许缓存(300 秒);8 个声明 no-store、8 个 private 或 no-cache、8 个完全没有 Cache-Control。Expires 只有 6 个站点返回,且全部早于抓取时间;ETag 与 Last-Modified 各 4 个。主动请求压缩后,24/25 返回 gzip 或 Brotli(gzip 23、br 1、无压缩 1),22 个声明 Vary: Accept-Encoding。
本期只读响应头与最多 1 KB 响应体,不解压、不保存正文;缓存策略不等于性能得分。
方法:显式请求压缩,只读头
沿用第 4 期 25 个首页,2026-11-03 12:40–12:41 串行请求,站间 ≥0.8 秒,UA 标明研究用途。请求头带 Accept-Encoding: gzip, deflate, br,只读响应头与最多 1 KB 响应体,不解压。
26 个候选 URL 中 25 个最终返回 200;E21 连续三次 502,未计入。其余 3 个首次失败(502 或 SSL EOF)在重试后恢复 200。
| 项 | 判定 | 边界 |
|---|---|---|
| 可缓存 | Cache-Control 含正 max-age | 只按字面值,不验证缓存命中 |
| no-store | 含 no-store,优先于 max-age | 可能是个性化或登录态所需 |
| private / no-cache | 含 private 或 no-cache,且无正 max-age | — |
| 未声明 | 没有 Cache-Control | 不推断不可缓存 |
| 压缩 | 本次请求实际返回的 Content-Encoding | 不测试压缩级别与解压后大小 |
| Expires 过期 | Expires 早于抓取时间 | 只对存在的 6 个站点判断 |
结果:缓存策略几乎全部“不可共享”
| Cache-Control 策略 | 站点数 | 占 25 |
|---|---|---|
| no-store | 8 | 32.0% |
| private 或 no-cache(无正 max-age) | 8 | 32.0% |
| 未声明 | 8 | 32.0% |
| 正 max-age(300 秒) | 1 | 4.0% |
“未声明”不等于“不可缓存”:共享缓存可能按启发式规则缓存;但站点没有给出明确有效期,CDN 与浏览器只能自行判断。明确 no-store 的 8 个站点则要求完全不存储。
| 项 | 站点数 | 说明 |
|---|---|---|
| 出现 max-age | 2 | 1 个为 300 秒,1 个为 0 |
| Expires | 6 | 全部早于抓取时间 |
| ETag | 4 | 16.0% |
| Last-Modified | 4 | 16.0%,与第 26 期一致 |
没有 ETag 或 Last-Modified 的页面,缓存只能按时间猜测何时重新获取;这与第 26 期“21/25 无 Last-Modified”的结论一致。
压缩:24/25 有压缩,Brotli 只有 1 个
| Content-Encoding | 站点数 | 占 25 |
|---|---|---|
| gzip | 23 | 92.0% |
| br(Brotli) | 1 | 4.0% |
| 无压缩 | 1 | 4.0% |
| deflate | 0 | 0% |
| 传输相关 | 站点数 | 说明 |
|---|---|---|
| Vary 含 Accept-Encoding | 22 | 88.0% |
| Vary 缺失 | 3 | 压缩仍可能返回,但缓存区分不足 |
| Transfer-Encoding: chunked | 16 | — |
| Content-Length | 9 | 与 chunked 互补,共 25 |
| CDN 标记(X-Cache/Via) | 2 | 仅按头名识别 |
压缩已接近普及:请求带 Accept-Encoding 时,24 个站点返回压缩内容。差异在算法:23 个只用 gzip,只有 1 个返回 Brotli。Vary 缺失的 3 个站点,遇到共享缓存时可能把压缩版本发给不支持压缩的客户端。
对验收的启示
- 首页是否允许缓存要写成明确策略。 25 个站点只有 1 个给出正 max-age;8 个明确 no-store。
- 区分 no-store 与未声明。 no-store 是明确要求,未声明只是把判断留给缓存。
- 校验器与日期头一起查。 只有 4 个站点有 ETag,4 个有 Last-Modified;两者都没有时,重验证只能靠时间。
- Vary 要跟随压缩。 22 个站点声明了 Accept-Encoding,3 个没有;压缩版本必须能被缓存正确区分。
- Brotli 仍可优化。 24 个压缩站点中只有 1 个用 br,其余为 gzip;是否启用取决于 CDN 与客户端支持。
局限
- 单次请求:2026-11-03 12:40–12:41 抓取一次,CDN/WAF 可能按地区或时间返回不同策略。
- 只读响应头:不验证浏览器与中间缓存的实际命中率,不测压缩后字节数。
- no-store 可能合理:登录态、个性化或合规要求都可能导致 no-store,本期不判断对错。
- 未声明不等于不可缓存:共享缓存可使用启发式规则;本期只记录站点是否给出明确指令。
- 25 家 pilot:不外推行业。
数据与复算
匿名数据:equipment-cache-compression-2026.csv(25 行 × 15 列:Cache-Control 原值、策略分类、max-age、Expires、ETag、Last-Modified、Vary、Content-Encoding、chunked、Content-Length、CDN 标记)。仓库内为 docs/research/2026-11-cache-compression.csv。
解析:scripts/cache_compression_probe.py;单元测试 scripts/test_cache_compression_probe.py(10 项,无网络)。运行:
python -m unittest scripts.test_cache_compression_probe
配套:HTTP 日期响应头 pilot、首页安全响应头 pilot、首页性能代理 pilot。
数据来源与口径
- 首页样本:第 4 期 25 个首页(同一批 sample_id)。
- 抓取:2026-11-03 12:40–12:41(Asia/Shanghai),串行、站间 ≥0.8 秒。
- 请求头:Accept-Encoding: gzip, deflate, br;只读头与最多 1 KB 响应体。
- 策略分类与压缩编码均按响应头字面值。