直接答案:2026-11-07 对第 104 期 13 个产品入口页各发 1 次请求(Accept-Encoding: gzip, br),13/13 返回 200,Content-Encoding 均为 gzip。13 页缓存原始 HTML 合计 1,184,145 字节,实测传输体合计 162,817 字节(159.0 KB),只占 13.7%,单页中位 17.2%。本地 gzip -9 重压合计 153,128 字节;本地 Brotli-11 估算 113,597 字节,比实测 gzip 传输体再小 30.2%,但服务器本次没有选择 Brotli。13:40 补测只声明 br:13/13 返回未压缩,0 页返回 Brotli,因此 30.2% 仍是本地估算,没有证据表明这些页面支持 Brotli。
压缩不是“有没有”,而是“省多少”:13 页全部启用了 gzip,但单页传输占比从 9.4% 到 34.5%,最高与最低相差约 3.7 倍。产品页验收如果只看原始 HTML 体积,会低估压缩差异,也会误以为“有 gzip”就等于“压到位”。
方法:一次真实协商 + 一次本地重压
样本为第 104 期的 13 个产品入口页缓存(2026-11-01 采集;P04/P14 无产品链接)。2026-11-07 12:41 起逐页请求一次,暴露的 Accept-Encoding 为 gzip, br;记录 HTTP 状态、Content-Encoding、Content-Type、传输体字节、按编码解码后的字节。请求间隔 1.5 秒,单页单次,不并发。
本地重压只针对缓存的原始文件:gzip 用 -9,Brotli 用 quality=11,是“上限估算”,不是服务器实际发送。传输体字节是 HTTP 消息体长度,不含 TLS/TCP 头;没有测 TTFB、缓存命中或 CDN 回源。
13:40 复测:每页先只声明 Accept-Encoding: br,再声明 gzip, br;br-only 是能力测试,不替代正常浏览器协商。两次请求间隔约 60 分钟,单页顺序请求。
| 项 | 口径 | 边界 |
|---|---|---|
| 实测传输 | 一次 GET 的响应消息体字节 | 不含 TLS/TCP 头 |
| 解码后字节 | 按 Content-Encoding 解压后的 HTML 字节 | 与缓存原始文件比较 |
| 本地 gzip / Brotli | 缓存文件重压,gzip -9 / Brotli-11 | 实验室估算,不是线上实际 |
| 缓存一致 | 解码后字节与 2026-11-01 缓存完全相同 | 仅字节,不比较 DOM |
结果:13/13 gzip,传输体只有原始 13.7%
| 指标 | 合计 / 中位 | 占缓存原始 |
|---|---|---|
| HTTP 200 | 13 / 13 | — |
| Content-Encoding: gzip | 13 | 100% |
| Content-Encoding: br | 0 | 0% |
| br-only 返回 br | 0 | 0% |
| br-only 返回未压缩 | 13 | 100% |
| 缓存原始字节 | 1,184,145 | 100% |
| 实测传输体 | 162,817 | 13.7% |
| 1 小时 gzip 复测传输体 | 162,819 | 13.7% |
| 复测与 12:41 差 | +2 B | 0.0% |
| 单页传输占比中位 | 17.2% | — |
| 本地 gzip -9 | 153,128 | 12.9% |
| 本地 Brotli-11 | 113,597 | 9.6% |
| Brotli 相对实测 gzip | 113,597 / 162,817 | 再省 30.2% |
| 解码后与缓存完全一致 | 10 / 13 页 | — |
注意分母:第 106 期拆分按解析后换行归一化计 1,179,680 字节;本轮按缓存原始文件计 1,184,145 字节,两者差 4,465 字节(0.4%),来自 CRLF/LF 差异。本文的“原始字节”均指缓存文件原始大小,以便和实测解码字节逐页对齐。
逐页结果(13 页)
| 页 | 缓存 KB | 传输 KB | 传输 % | gzip -9 | Brotli -11 | 缓存一致 |
|---|---|---|---|---|---|---|
| P01 | 7.9 | 2.7 | 33.9% | 33.9% | 23.6% | 是 |
| P02 | 232.4 | 22.0 | 9.4% | 7.4% | 5.2% | 是 |
| P03 | 159.3 | 13.7 | 26.9% | 11.5% | 8.1% | 否(-110,967 B) |
| P05 | 158.0 | 18.4 | 11.7% | 9.8% | 7.1% | 否(-92 B) |
| P06 | 100.7 | 17.0 | 16.8% | 16.6% | 12.9% | 是 |
| P07 | 93.8 | 15.8 | 16.9% | 15.0% | 10.9% | 是 |
| P08 | 29.5 | 7.8 | 26.6% | 23.9% | 18.8% | 是 |
| P09 | 41.1 | 7.1 | 17.2% | 16.6% | 13.0% | 是 |
| P10 | 14.8 | 3.5 | 23.4% | 23.4% | 17.2% | 是 |
| P11 | 94.9 | 15.7 | 16.5% | 14.1% | 10.4% | 否(-16 B) |
| P12 | 13.4 | 4.6 | 34.5% | 26.3% | 19.9% | 是 |
| P13 | 170.4 | 23.2 | 13.6% | 13.6% | 10.4% | 是 |
| P15 | 40.2 | 7.6 | 19.0% | 18.8% | 14.5% | 是 |
三个尾巴:P12 原始只有 13.4 KB,传输占比 34.5%,是小页里最差的;P01 7.9 KB / 33.9% 同样说明小页更难压。P02 原始 232.4 KB,传输只占 9.4%,大页里的重复空白/markup 反而更容易压。P03 的缓存一致为“否”,实测解码后只有 52,121 字节(比缓存少 110,967),说明页面内容已经变化,它的 26.9% 不能和缓存重压率直接对比。
“有 gzip”不等于“压到最省”
在 10 个解码后与缓存完全一致的页面里,实测 gzip 传输体合计 113,904 字节,本地 gzip -9 为 104,780 字节,实测比本地 -9 高 8.7%。分页看,多数页面接近 100%(P01 100.1%、P10 100.0%、P13 100.4%),但 P12 为 131.0%、P02 为 126.8%、P07 为 112.1%、P08 为 111.3%。这可能与服务器压缩级别或实现有关;本轮没有读取服务器配置,不能断言原因,但可以说明“启用 gzip”之后仍有压降空间。
Brotli 的 30.2% 是本地 -q 11 对同一批缓存文件的估算。服务器在 gzip, br 同时可用时全部选择 gzip;13:40 只声明 br 时,13/13 又全部返回未压缩,0 页返回 br。这个数字只能作为“如果启用 Brotli”的上限参考,不能写成线上已省,也没有证据表明这 13 页支持 Brotli;若要上线 Brotli,需要服务器/CDN 侧配置后再测。
1 小时复测:gzip 稳定,br-only 全部未压缩
2026-11-07 13:40 对同一批 13 页复测:先只声明 Accept-Encoding: br,再声明 gzip, br。结果 0/13 返回 br,13/13 的 br-only 响应没有 Content-Encoding,直接发送未压缩 HTML;而 gzip, br 仍是 13/13 gzip。
br-only 合计传输体 1,073,070 字节,是 gzip 复测 162,819 字节的 6.6 倍。正常浏览器通常同时声明 gzip,所以这不是普通用户路径;但它说明不能假设“服务器会自动用 Brotli 兜底”。gzip 复测合计仅比 12:41 多 2 字节,13/13 解码字节与 12:41 完全一致,1 小时内内容稳定。
| 页 | br-only 编码 | br-only KB | gzip 复测 KB | 与 12:41 差 | 解码一致 |
|---|---|---|---|---|---|
| P01 | 未压缩 | 7.9 | 2.7 | 0 | 是 |
| P02 | 未压缩 | 232.4 | 21.9 | -1 | 是 |
| P03 | 未压缩 | 50.9 | 13.7 | +4 | 是 |
| P05 | 未压缩 | 157.9 | 18.4 | 0 | 是 |
| P06 | 未压缩 | 100.7 | 17.0 | 0 | 是 |
| P07 | 未压缩 | 93.8 | 15.8 | 0 | 是 |
| P08 | 未压缩 | 29.5 | 7.8 | +1 | 是 |
| P09 | 未压缩 | 41.1 | 7.1 | +1 | 是 |
| P10 | 未压缩 | 14.8 | 3.5 | -1 | 是 |
| P11 | 未压缩 | 94.9 | 15.7 | 0 | 是 |
| P12 | 未压缩 | 13.4 | 4.6 | -2 | 是 |
| P13 | 未压缩 | 170.4 | 23.2 | 0 | 是 |
| P15 | 未压缩 | 40.2 | 7.6 | 0 | 是 |
与首页、文章页的压缩对照
| 样本 | 编码分布 | 传输占比中位 | 样本框 |
|---|---|---|---|
| 13 个产品页 | gzip 13;br-only 0 | 17.2% | 第 104 期产品入口页 |
| 14 个首页 | gzip 12 / br 1 / 未压缩 1 | 21.0% | 首页 pilot |
| 10 篇文章页 | gzip 10 | 26.9% | 文章页 live 子样本 |
三组样本框不同、采集时间也可能不同,不能把中位差当成“页面类型效应”。能确定的是:本批产品页的 gzip 覆盖是 13/13,但单页压缩率差异很大;拿一个全站平均值去验收具体页面,会掩盖小页高占比和大页低占比。
对验收的启示
- 验收看 wire/decoded,不只看原始 HTML。 同一批 1.18 MB 原始文件,实际传输 159 KB;只报原始体积会高估负担。
- 确认编码协商。 用同一 UA 发
Accept-Encoding: gzip, br,记录实际 Content-Encoding;本次补测 br-only 为 0/13 返回 br、13/13 未压缩,验收应同时测两种声明。 - 检查压缩级别/实现。 10 个一致页面里实测 gzip 比本地 -9 高 8.7%;P12、P02 超过 26%,值得问服务器或 CDN 配置。
- 小页也要看比例。 P01/P12 传输占比 33.9%/34.5%,小页的固定开销更明显,不能只优化大页。
- 把内容变化排除。 P03 解码字节少了 110,967,压缩率对比失效;改版后应重新取缓存再算。
局限
- 13 页 pilot:第 104 期同一批产品入口页;不是全站产品页,也不外推行业。
- 请求次数有限:12:41 每页 1 次,13:40 复测每页 2 次;未测更长时间、CDN 命中或地区差异。
- br-only 已测但范围有限:0/13 返回 br、13/13 未压缩;只能说明这 13 页在两次请求下的行为,不能推断所有路径或 CDN。
- 本地重压是估算:gzip -9 / Brotli-11 是实验室上限,不等于线上配置,也没有测 CPU 成本。
- 字节口径有限:只算 HTTP 消息体,不含 TLS/TCP 头、请求头、DNS、TTFB 或渲染。
- 内容快照:2026-11-01 缓存;P03/P05/P11 与缓存有差异;1 小时复测中 13/13 解码字节与 12:41 一致。
数据与复算
匿名数据:首测 equipment-product-entry-html-compression-2026.csv(13 行 × 16 列);1 小时复测 equipment-product-entry-html-compression-recheck-2026.csv(13 行 × 13 列:br-only 编码/字节、gzip 复测字节、相对首测差、解码一致性)。仓库内分别为 docs/research/2026-11-product-entry-html-compression.csv 与 docs/research/2026-11-product-entry-html-compression-recheck.csv。
解析:scripts/article_html_compression_probe.py(live 记录协商与 wire/decoded;local 做 gzip -9 / Brotli-11 重压);单测 scripts/test_article_html_compression_probe.py(7 项)。运行:
python -m unittest discover -s scripts -p "test_article_html_compression_probe.py"
配套:产品入口页 HTML 体积组成 pilot、产品入口页图片交付 pilot、首页 HTML 压缩 pilot。
数据来源与口径
- 样本:第 104 期 13 个产品入口页缓存(2026-11-01 采集;P04/P14 无产品链接)。
- 实测:2026-11-07 12:41(Asia/Shanghai)逐页 1 次 GET,
Accept-Encoding: gzip, br,间隔 1.5 秒。 - 本地重压:缓存原始文件,gzip -9 / Brotli-11;站点与产品 URL 不公开。
常见问题
13/13 返回 gzip,说明服务器不支持 Brotli 吗?
不能。正常协商时 13/13 选择 gzip;2026-11-07 13:40 只声明 br 时,13/13 返回未压缩,0 页返回 br。这 13 页没有表现出 Brotli 支持,但仍不能推断所有路径或 CDN。
162,817 字节和 1.18 MB 是什么关系?
1,184,145 是缓存原始 HTML;162,817 是实测 HTTP 消息体。两者相除为 13.7%,不是 1.18 MB 被“删除”,而是压缩后的传输大小。
为什么 P03 的传输占比不能和缓存比?
P03 解码后只有 52,121 字节,比缓存少 110,967,页面内容已经变化;它的 26.9% 是当天新内容的压缩率,不是缓存文件的重压率。
本地 Brotli 的 30.2% 能直接写成线上节省吗?
不能。Brotli-11 是对缓存文件的实验室重压;br-only 补测中 0/13 返回 br,30.2% 只是“如果启用”的上限,未验证部署和 CPU 成本。
有 gzip 还需要优化吗?
需要看级别。10 个内容一致的页面里,实测 gzip 合计比本地 -9 高 8.7%;P12/P02 分别高 31.0%/26.8%,可能存在压缩级别或实现差异。
1 小时复测稳定吗?
2026-11-07 13:40 复测:13/13 仍 gzip,解码字节与 12:41 全部一致;传输体合计 162,819 字节,比 12:41 多 2 字节,单页变化 -2~+4 字节。
数据能复核吗?
可以。13 行 × 16 列首测 CSV、13 行 × 13 列复测 CSV,以及 7 项无网络压缩/解码单测都在仓库内;不公开站点与产品 URL。