在 Service Worker 里转发的接口请求偶尔返回 401,同一账号在页面里直接请求正常,抓包看到转发出去的请求没有 Cookie 头。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,新建 Request 时如果显式传了 credentials: 'omit',或者从跨域请求里复制了配置,Cookie 就不会带上。SW 里 fetch 的默认值跟随请求本身,不是永远同源。

「SW 请求丢 Cookie」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

const req = new Request(event.request, {
  credentials: 'include'
});
return fetch(req);

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,转发时统一用 new Request(event.request, {credentials: 'include'}),别手拼请求头;检查是否有代码手动删掉了 Cookie 头,浏览器本来也不允许脚本设置它;改完用同一条链路连续请求二十次,确认不再出现 401。

最后用这个标准收尾,登录后连续刷新二十次,接口全部返回 200,Network 里转发请求带上了 Cookie。

作者 9823189