You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Express中response.redirect触发CORS跨域问题求助

问题排查与修复

核心原因分析

你的问题出在两个关键节点:

  1. 未正确处理OPTIONS预检请求:前端发送带credentials: include的请求时,浏览器会先发OPTIONS预检请求。你的中间件直接调用next()让请求继续流转,Express默认逻辑无法正确处理这类请求的CORS头,导致返回的Access-Control-Allow-Origin被设为通配符*,触发报错。
  2. origin匹配逻辑存在漏洞:如果请求的origin头不存在(部分特殊场景会出现),中间件不会设置Access-Control-Allow-Origin头,浏览器会判定为无效配置,进而触发跨域拦截。

修复方案

1. 修改CORS中间件,完善预检处理与origin校验

替换你的CORS中间件为以下代码:

function cors(req: Request, res: Response, next: NextFunction) {
  const allowedOrigins = ["http://localhost:3000"];
  const origin = req.headers.origin as string;

  // 严格校验origin,不存在或不在白名单直接拒绝
  if (!origin || !allowedOrigins.includes(origin)) {
    return res.status(403).send("Origin not allowed");
  }

  res.setHeader("Access-Control-Allow-Origin", origin);
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  res.setHeader("Access-Control-Allow-Credentials", "true");

  // 单独处理OPTIONS预检请求,直接返回200结束响应
  if (req.method === "OPTIONS") {
    return res.status(200).end();
  }

  next();
}

2. 验证redirect场景的响应头

修改后,bar控制器执行response.redirect时,重定向响应会携带与前端origin匹配的Access-Control-Allow-Origin头,浏览器不会再触发通配符相关的跨域报错。

额外检查点

  • 确认bar路由已正确应用该CORS中间件(全局中间件则无需额外操作);
  • 前端请求需保持credentials设置为include,与后端配置一致。

内容的提问来源于stack exchange,提问作者Bennyh961

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:12:45