直接答案:对 25 个装备企业官网各取 DOM 顺序第一张 img:2 个首页没有图片、23 个有 URL。23 个 URL 中 20 个返回 200、2 个 567、1 个 404;20 个 200 里只有 19 个 Content-Type 是 image/*,另 1 个是 text/html。19 张可用图中,PNG 16、JPEG 2、SVG 1;11 张有正 max-age、8 张没有 Cache-Control。扩展到每页前 4 张后:94 个位置中 68 个 200(64 张 image/*)、19 个 567、4 个 404、1 个请求错误、2 页无图;64 张可用图中 32 张可缓存、32 张没有 Cache-Control。
11 张可缓存图片的 max-age:14 天 4、30 天 3、一年 3、5 分钟 1,中位 30 天。19 张可用图都带 Last-Modified 与 ETag,但验证器不能替代显式 max-age;没有 Cache-Control 的 8 张只能依赖启发式缓存。
方法:首图,HEAD 优先,GET 兜底
复用第 4 期 25 个首页缓存,按 DOM 顺序取第一个非 data:/blob:/javascript: 的 img src;不判断它是不是产品主图。2026-11-07 23:41 逐条请求一次,HEAD 优先,带 Accept-Encoding: gzip, br 与 Referer;HEAD 返回 400/403/405/501 或连接失败时改用 GET。记录状态、方法、Cache-Control、max-age、ETag、Last-Modified、Vary、Content-Encoding、Content-Type、长度、Age、Server 与 CDN 标记。
“可用图”要求 200 且 Content-Type 为 image/*;200 的 HTML 不计。缓存分类:max-age > 0 可缓存;no-store/private/no-cache 私有不缓存;max-age=0 单列;无头 missing。
| 项 | 数量 |
|---|---|
| 首页样本 | 25 |
| 有 img URL | 23 |
| 没有图片 | 2(E18、E20) |
| 200 | 20 |
200 且 image/* | 19 |
| 200 但是 HTML | 1(E17) |
| 567 | 2(E09、E22) |
| 404 | 1(E24) |
| 可缓存(可用图) | 11 |
| 无 Cache-Control(可用图) | 8 |
结果:19 张可用图,11 张可缓存
| 页 | 状态 / 类型 | 策略 / max-age | 来源 |
|---|---|---|---|
| E01 | 200 image/png | missing / — | 站内 |
| E02 | 200 image/png | missing / — | 站内 |
| E03 | 200 image/png | cacheable / 14d | 站内 |
| E04 | 200 image/png | cacheable / 1y | 站内 |
| E06 | 200 image/png | cacheable / 14d | 站内 |
| E08 | 200 image/png | missing / — | 站内 |
| E09 | 567 text/markdown | missing / — | 站外 |
| E11 | 200 image/png | cacheable / 30d | 站内 |
| E12 | 200 image/png | cacheable / 30d | 站内 |
| E13 | 200 image/png | missing / — | 站内 |
| E14 | 200 image/png | cacheable / 14d | 站内 |
| E16 | 200 image/png | cacheable / 1y | 站外 |
| E17 | 200 text/html | missing / — | 站内 |
| E18 | 无图片 | — | — |
| E19 | 200 image/png | missing / — | 站内 |
| E20 | 无图片 | — | — |
| E22 | 567 text/markdown | missing / — | 站外 |
| E23 | 200 image/png | cacheable / 14d | 站内 |
| E24 | 404 text/html | private / — | 站内 |
| E25 | 200 image/png | cacheable / 1y | 站内 |
| E26 | 200 image/png | missing / — | 站内 |
| E27 | 200 image/png | missing / — | 站内 |
| E28 | 200 image/png | cacheable / 30d | 站内 |
| E29 | 200 image/png | cacheable / 5m | 站内 |
| E30 | 200 image/png | missing / — | 站内 |
19 张可用图中,PNG 16、JPEG 2、SVG 1;11 张可缓存、8 张没有 Cache-Control。3 张首图来自站外:E09、E22 都是 567,E16 是 200 且一年 max-age。E17 的首图 URL 返回 200 但 Content-Type 是 text/html,不是图片;E24 的 404 带 private/no-cache。
扩展到前四张:64/94 可用,19 个 567
为看后续图片是否更差,对同 25 页按 DOM 顺序各取前 4 个唯一 img src,共 94 个位置(E18/E20 无图,共 2 个空位;其余 23 页各 4 个)。2026-11-08 00:42 逐条请求一次,方法与首图相同。
结果:68 个 200、19 个 567、4 个 404、1 个请求错误。68 个 200 中 64 张是 image/*(PNG 41、JPEG 19、SVG 4),4 张是 200 HTML(E17 的 4 张)。19 个 567 全部来自 H1 外链:E03/E06/E09/E14/E23 各 3 张、E22 4 张;E24 的 4 张都是 404;E04 第 4 张因 URL 非 ASCII 的请求头编码失败,记 error。
64 张可用图中 32 张有正 max-age、32 张没有 Cache-Control;可缓存 max-age 为 30 天 12、一年 11、14 天 5、5 分钟 4,中位 30 天。68 个 200 中 64 个有 ETag/Last-Modified,但验证器仍不能替代显式 max-age。
| 页 | 可用图 | 567 | 404 / 错误 | 可缓存 | 无 CC |
|---|---|---|---|---|---|
| E01 | 4 | 0 | 0 | 0 | 4 |
| E02 | 4 | 0 | 0 | 0 | 4 |
| E03 | 1 | 3 | 0 | 1 | 0 |
| E04 | 3 | 0 | 1 错误 | 3 | 0 |
| E06 | 1 | 3 | 0 | 1 | 0 |
| E08 | 4 | 0 | 0 | 0 | 4 |
| E09 | 1 | 3 | 0 | 1 | 0 |
| E11 | 4 | 0 | 0 | 4 | 0 |
| E12 | 4 | 0 | 0 | 4 | 0 |
| E13 | 4 | 0 | 0 | 0 | 4 |
| E14 | 1 | 3 | 0 | 1 | 0 |
| E16 | 4 | 0 | 0 | 4 | 0 |
| E17 | 0 | 0 | 0(4 个 200 HTML) | 0 | 0 |
| E18 | 0 | 0 | 0 | 0 | 0 |
| E19 | 4 | 0 | 0 | 0 | 4 |
| E20 | 0 | 0 | 0 | 0 | 0 |
| E22 | 0 | 4 | 0 | 0 | 0 |
| E23 | 1 | 3 | 0 | 1 | 0 |
| E24 | 0 | 0 | 4 | 0 | 0 |
| E25 | 4 | 0 | 0 | 4 | 0 |
| E26 | 4 | 0 | 0 | 0 | 4 |
| E27 | 4 | 0 | 0 | 0 | 4 |
| E28 | 4 | 0 | 0 | 4 | 0 |
| E29 | 4 | 0 | 0 | 4 | 0 |
| E30 | 4 | 0 | 0 | 0 | 4 |
关键变化:首图只有 2 个 567,前 4 张增到 19 个;E03/E06/E14/E23 都是“1 张站内 + 3 张 H1 567”,E22 四张全是 567。首图可用不等于第 2–4 张可用;只看首屏第一张会低估外链图片问题。
三个容易误判的点
- 200 不等于图片。 E17 返回 200 但正文是 HTML;只看状态会把可用图从 19 高估到 20。要同时看 Content-Type 与 magic bytes。
- 567 不是缓存策略问题。 E09、E22 的 567 是 29–30 字节
text/markdown,没有图片字节,也没有 Cache-Control;不能把 567 当成“不可缓存图片”。 - 有 ETag 不等于有 max-age。 19 张可用图都带 Last-Modified 与 ETag,但 8 张仍没有 Cache-Control;验证器只解决“变没变”。
对验收的启示
- 首图先验 Content-Type 与字节。 200 +
image/*才算可用;200 HTML、567 与 404 分开记。 - 给图片显式 Cache-Control。 19 张可用图里 8 张没有该头;至少区分带指纹的图片与可替换的运营图。
- 长缓存要配版本化 URL。 11 张可缓存图里 3 张一年、3 张 30 天;没有指纹时,长缓存会增加换图成本。
- 站外图要单独看。 3 张站外首图里 2 张 567;CDN 变更会直接影响首屏。
- 首图不等于全部图片,也不等于前四张。 前 4 张里 567 从 2 个增到 19 个;958 张全量仍需另测。
局限
- 25 站 pilot:同一批首页缓存;不是行业总体,也不代表全部 958 张图片。
- 只取前四张:25 页 × 4 个位置,共 94 个;不代表产品主图或全部 958 张;1 个 URL 请求错误。
- HEAD 优先:E19、E29 用 GET 兜底;方法逐行记录,不把工具失败当策略。
- 单次快照:2026-11-07 23:41;未复测改版、CDN 边缘或不同地区。
- 只看响应头:不测 TTFB、渲染、LCP 或浏览器缓存命中。
数据与复算
匿名数据:equipment-homepage-first-image-cache-2026.csv(25 行 × 19 列:是否找到、站外、状态、方法、Cache-Control、策略、max-age、ETag、Last-Modified、Vary、编码、Content-Type、长度、Age、Server、CDN、错误、时间)。仓库内为 docs/research/2026-11-homepage-first-image-cache.csv。前四张扩展:equipment-homepage-first-four-images-2026.csv(94 行 × 19 列:图片序号、站外、状态、方法、Cache-Control、策略、max-age、ETag、Last-Modified、Vary、编码、Content-Type、长度、Age、Server、CDN、错误、时间)。仓库内另存 docs/research/2026-11-homepage-first-four-images.csv。
采集:Python urllib,HEAD 优先、GET 兜底,带 Accept-Encoding: gzip, br 与 Referer;策略分类复用 scripts/cache_compression_probe.py 的 evaluate()。站点与完整 URL 不公开。
配套:首页静态资源清单 pilot、首页 CSS/JS 缓存头 pilot、首页图片交付 pilot。
数据来源与口径
- 样本:第 4 期 25 个首页缓存(2026-10-31);每页 DOM 第一张 img。
- 请求:2026-11-07 23:41,HEAD 优先、GET 兜底,25 次。
- 可用图:200 且 Content-Type 为
image/*;200 HTML、567、404 分开记。
常见问题
200 就代表图片可用吗?
不代表。E17 的 4 张图都返回 200 但 Content-Type 是 text/html;必须同时看 image/* 与字节。
为什么会有 19 个 567?
6 个站点的 19 张外链图都是 H1 主机:E03/E06/E09/E14/E23 各 3 张,E22 4 张;首图可用不代表第 2–4 张可用。
64 张可用图的缓存策略如何?
32 张有正 max-age、32 张没有 Cache-Control;可缓存 max-age 中位 30 天(30 天 12、一年 11、14 天 5、5 分钟 4)。
ETag / Last-Modified 能替代 Cache-Control 吗?
不能。68 个 200 里 64 个有 ETag/Last-Modified,但 32 张可用图仍没有显式 max-age;验证器只解决资源是否变化。
1 个错误是什么?
E04 的第 4 张图 URL 含非 ASCII 字符,请求头编码失败;记为 error,不写成 404 或 567,也不推断服务器。
为什么每页只取前 4 张?
25 页 × 4 张,共 94 个位置;能看首屏一组图片,但不等于全部 958 张,也不判断主图语义。
为什么只测首图?
本轮同时保留首图基线和前 4 张扩展;前 4 张用于看后续图片是否更差,不是全站总量。
数据能复核吗?
可以。25 行首图 CSV 与 94 行前四张 CSV 都在仓库;状态、方法、Cache-Control、max-age、ETag、Last-Modified、Vary、编码、Content-Type 与错误逐条记录;站点与完整 URL 不公开。