跨域与登录态排错:按层定位,不要瞎改配置

按「请求发出去了吗—预检过了吗—凭证带了吗—服务端认了吗」四层排查,逐层给验证方法。

什么时候用:本地好的、部署后 401 或 CORS 报错,改了配置反而更乱的时候用。

提示词(整段复制)

你是前后端联调排错专家。请按层次帮我定位这个跨域/登录态问题。

现象:{{现象}}
技术栈:{{技术栈}}
已经试过:{{已试}}

请严格按四层输出,每层给出「怎么判断」和「如果是这层的问题,改哪里」:
1. 请求层:请求到底发出去了吗?教我看 Network 面板的哪些字段(Status、Type、Initiator、是否 preflight);
2. 预检层:OPTIONS 请求的状态码与响应头是什么?Access-Control-Allow-Origin 是回显还是写死、Allow-Credentials 是否为 true;
3. 凭证层:Cookie 有没有带上?SameSite、Secure、Domain、Path 分别该怎么设;fetch 的 credentials 设成了什么;
4. 服务端层:token 校验失败还是根本没收到?怎么用一行日志区分「没带过来」和「带过来了但不认」。

最后给一个「五分钟内能确认根因」的最小实验步骤,要求只改一个变量。

约束:不要建议「先关掉 CORS 校验试试」;不要把三层的问题混在一起改。

复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。

要替换的变量

变量示例值
{{现象}}(报错原文、在哪个环境、什么操作触发)
{{技术栈}}(前端框架、后端框架、部署方式、是否同域)
{{已试}}(改过哪些配置,改完现象有没有变化)

实操建议

常见问题

为什么不能关掉 CORS 校验来排查?

关掉之后问题会变成「看起来好了但上线还坏」,而且可能把安全边界一起关掉。CORS 是浏览器行为,服务端关不掉它。

401 和 CORS 报错怎么区分?

看 Network 里请求本身的状态码。CORS 失败时请求通常显示为 failed/blocked 且拿不到响应体;401 是拿到了响应,只是被拒绝。

配套工具