会话启动发送数据时遇CORS错误,仅收Token响应且API已配置仍报错
解决CORS预检请求重定向错误
你的错误核心是预检OPTIONS请求被服务器重定向了,浏览器不允许预检请求返回重定向状态码(3xx),必须直接返回200/204确认跨域权限。以下是具体排查和修复步骤:
1. 修正请求URL的协议一致性
Heroku默认会强制将HTTP请求重定向到HTTPS,如果你前端用http://开头的URL发起请求,会触发自动重定向,导致预检请求失败。把请求URL改成HTTPS:
const submit = (e) => { axios.post("https://back-reserva.herokuapp.com/api/v1/users/login", e).then(res => console.log(res)) }
2. 排查服务器端的路由重定向规则
检查后端是否对/api/v1/users/login路径设置了重定向(比如强制添加末尾斜杠到/login/)。这种情况下OPTIONS请求会被重定向,直接触发CORS错误。
- 修复路由配置,确保
/login和/login/路径都能正常响应,或者统一路径格式。 - 用curl测试预检请求,确认返回状态码:
如果返回3xx状态码,说明确实存在重定向,需要调整服务器配置。curl -X OPTIONS https://back-reserva.herokuapp.com/api/v1/users/login -H "Origin: http://localhost:3000" -v
3. 确保CORS中间件正确处理预检请求
如果后端用Express框架的cors中间件,检查以下配置:
- 确保CORS中间件在所有路由、重定向中间件之前加载,避免OPTIONS请求先被重定向逻辑拦截。
- 配置
optionsSuccessStatus: 204,让预检请求返回符合规范的204状态码:const cors = require('cors'); app.use(cors({ origin: 'http://localhost:3000', // 或根据需求设置允许的来源 optionsSuccessStatus: 204 })); - 确认
Access-Control-Allow-Methods包含POST,Access-Control-Allow-Headers覆盖前端发送的所有请求头(比如Content-Type)。
4. 排除其他中间件干扰
检查是否有安全中间件(如helmet)、路由重写中间件在CORS中间件之前处理请求,导致预检请求被拦截或重定向。调整中间件顺序,让CORS中间件优先处理所有请求。
关于你提到的“仅能收到Token作为响应”:这属于正常业务逻辑,等CORS问题解决后,前端即可正常接收并处理该响应。
内容的提问来源于stack exchange,提问作者Diego Nieves
相关产品推荐
相关产品推荐

