{
  "sop_id": "SOP-STATIC-CACHE-INVALIDATE-001",
  "rule_ref": "META-RULE-020-STATIC-CACHE-INVALIDATE",
  "anchor": "Ω₀⊂⊙∞⊂Ω",
  "did": "DID-BR-000002",
  "created_at": "2026-10-24 15:40:39",
  "content": "# 静态资源发布即清缓存 SOP（META-RULE-020 落地执行）\n\n## 目标\n官网静态资源（白皮书库 / 交付包 / 销售页 / 任何 .html）更新发布后，保证**同一 URL 始终返回最新内容**，\n修复即生效，禁止出现\"已修复但用户点开旧链接仍见旧版 / 404\"。\n\n## 核心原则\n**URL 是资源唯一 ID**：修复 = 替换该 ID 指向的实体。同一 URL 不允许因缓存同时指向新旧两版。\n鉴权 token 只控制\"能否访问\"，不控制\"URL 指向哪份文件\"。\n\n## 三层缓存失效（发布必做）\n| 层 | 检查项 | 处置 |\n|---|---|---|\n| ① 浏览器本地缓存 | 页面响应头无强缓存(Cache-Control/expires)时，浏览器启发式缓存旧版不回源 | 发布后校验响应头；对无法改响应头的静态页，通知用户 Ctrl+F5 强刷 / 无痕模式 |\n| ② Nginx 服务端缓存 | proxy_cache / fastcgi_cache 是否缓存旧副本 | 上传新文件后 `nginx -t && nginx -s reload` |\n| ③ 源文件一致性 | 云端文件是否真被新版本覆盖 | ssh 对比云端文件 SHA256 与本地发布版哈希一致 |\n\n## 发布流程（内置到每次静态更新）\n1. 上传新文件到云端\n2. ssh 核验云端文件 SHA256 == 本地发布版 SHA256（确认覆盖成功）\n3. `nginx -t && nginx -s reload`（如配置缓存层）\n4. `curl -H \"Cache-Control: no-cache\" <URL>` 验证返回最新内容（绕过缓存）\n5. 验证通过 → 更新锁档台账（记录新 hash）\n6. 给用户转发链接 = 该 URL（已指向最新实体）\n\n## 验收硬性标准\n- 更新后普通访问与无痕/强刷新访问均返回最新内容\n- 云端源文件 hash 与发布版一致\n- 用户通过同一 URL 只能看到最新版本\n\n## 当前项目状态（实测）\n- 云端白皮书主页源文件已是修复版（含 ../ 链接，2026-10-24 12:00 覆盖）\n- 服务端返回正确（curl 绕过缓存返回 ../ 链接）\n- 响应头：ETag + Last-Modified（协商缓存），无显式 Cache-Control 强缓存\n- 用户端\"仍见旧版\" = 浏览器本地启发式缓存旧页面，需强刷新/无痕清除\n",
  "sha256": "08b87404c6967bc9af1d676527589a121ca9fa353e6f3c4d5b2361476c78a47a"
}