fix(covers): 封面地址是签名过期而非防盗链,改为本地缓存
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s

实测推翻了之前的诊断。同一批图:

  当天签发的地址 /202610080841/...  -> 200,带不带 Referer 都一样
  隔天的地址     /202610070837/...  -> 403,带不带 Referer 都一样

路径里那段时间戳就是签发时刻。所以这是**过期**,Referer 根本不是那个维度 ——
上一轮加 referrerPolicy 是照着错误结论改的,白改。

修法:
- 采集入库时每轮刷新 cover 地址。原先只在首次入库写一次,旧作品的地址烂在库里,
  而且再怎么重跑也修不回来
- 新增 api/monitor/covers.py:把图下载落盘。图一旦落盘就与签名无关,永远可读
- 下载放在 runner 的 Phase 5(事务已提交之后),不放 ingest —— ingest 的文档写明
  No network,往里塞网络请求会毁掉它可离线测试这一点
- 新增 GET /api/monitor/covers/{note_id} 取图。这条路由带鉴权,封面不会被匿名读走
- service 返回本地地址优先,没有缓存时才退回远程
- 每轮只补一批(60 张):一次跑几百张既慢又会给图床压力,而旧地址本来就在陆续过期,
  分摊到几轮反而更稳

顺带修正 NoteCover 的注释 —— 它写着防盗链,而那个结论已被推翻,留个错的注释比没有更糟。
This commit is contained in:
2026-10-08 08:45:30 +08:00
parent fa227600fe
commit b11bbf771a
6 changed files with 224 additions and 11 deletions
+9 -6
View File
@@ -1,14 +1,17 @@
/**
* 作品封面缩略图。
*
* `referrerPolicy="no-referrer"` 是功能性的,不是装饰。小红书的图床对带**外部
* Referer** 的请求一律返回 403,而浏览器对跨域 `<img>` 默认就会带上本站的源作为
* Referer —— 于是封面全都显示成破图,而 URL 本身完全正常。实测同一张图:
* **图为什么曾经全是破图**:不是防盗链。小红书图床的地址**带签名、会过期** ——
* 路径里那段时间戳就是签发时刻。实测同一批图:
*
* 无 Referer -> 200, 67968 B, image/webp
* Referer 为本站 -> 403, 0 B
* 当天签发的地址 -> 200,带不带 Referer 都一样
* 隔天的地址 -> 403,带不带 Referer 都一样
*
* 放在一个组件里,是为了让下一个要显示封面的页面不会漏掉这个属性。
* 所以 Referer 根本不是那个维度,改它是白改。真正的解法是后端把图**下载到本地**,
* 前端拿到的是 `/api/monitor/covers/{note_id}` —— 与签名无关,不会过期。
*
* `referrerPolicy` 保留着,是因为它仍然是个合理的默认(外链图不该把自己的地址
* 泄露给第三方),但**它不再是这里能正常显示的原因**。
*/
const SIZES = {