curl -I "https://bucket.s3.amazonaws.com/a.jpg?X-Amz-Signature=..." # 期望响应头包含 cache-control: no-store
图片链接设了十分钟有效期,用户十分钟后再点还是能打开,换一台设备就 403。抓包看到响应来自 disk cache,状态码 200。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,预签名 URL 本身是普通 GET,浏览器和 CDN 按响应头决定缓存多久。响应里没有 Cache-Control,启发式缓存就可能把带签名的地址存下来。签名过期只影响回源,本地副本照样返回。
「预签名 URL 缓存」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:预签名响应加 Cache-Control: no-store 或 private;CDN 上把带签名参数的请求排除在缓存之外;不要把预签名地址写进静态 HTML 或本地存储;验证时用无痕窗口并禁用缓存。
改完只确认一件事:过期后刷新页面返回 403,不再从 disk cache 拿到 200。
