跨域与登录态排错:按层定位,不要瞎改配置
按「请求发出去了吗—预检过了吗—凭证带了吗—服务端认了吗」四层排查,逐层给验证方法。
提示词(整段复制)
你是前后端联调排错专家。请按层次帮我定位这个跨域/登录态问题。
现象:{{现象}}
技术栈:{{技术栈}}
已经试过:{{已试}}
请严格按四层输出,每层给出「怎么判断」和「如果是这层的问题,改哪里」:
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 校验试试」;不要把三层的问题混在一起改。复制时把 {{变量}} 换成你自己的内容;变量名不要改,改了模型容易把它当普通文字。
要替换的变量
实操建议
- 「改完现象有没有变化」这一栏非常关键:有变化说明方向对了只是没改全,没变化说明根本不在这一层
- preflight 的 Allow-Credentials 和 Allow-Origin 是一对:Allow-Origin 写成星号时,浏览器会直接拒绝带凭证的请求
- 本地好、线上坏,八成是 Domain 或 Secure 的问题。先看 Cookie 有没有真的写到浏览器里
常见问题
为什么不能关掉 CORS 校验来排查?
关掉之后问题会变成「看起来好了但上线还坏」,而且可能把安全边界一起关掉。CORS 是浏览器行为,服务端关不掉它。
401 和 CORS 报错怎么区分?
看 Network 里请求本身的状态码。CORS 失败时请求通常显示为 failed/blocked 且拿不到响应体;401 是拿到了响应,只是被拒绝。
