API请求中CORS预检请求异常:仅发送OPTIONS请求无后续请求的问题求助
API请求中CORS预检请求异常:仅发送OPTIONS请求无后续请求的问题求助
看起来你遇到了一个典型的CORS预检卡壳问题——浏览器发了OPTIONS预检请求后,直接终止了后续的POST请求,甚至连其他API都只发OPTIONS不发实际请求。结合你给的代码和后端日志,我来帮你一步步排查:
核心问题大概率出在后端CORS配置上
从你的GIN日志看,OPTIONS请求返回了204,但浏览器可能认为预检响应的CORS头不符合规则,直接阻止了后续请求。重点检查这几个关键配置:
自定义请求头的权限
你的前端请求带了X-Timestamp、X-Signature、X-Nonce这几个自定义头,后端必须在预检响应的Access-Control-Allow-Headers里明确列出这些头,否则浏览器会判定预检不通过。带凭证的跨域规则
你在fetch里设置了credentials: 'include',这意味着:- 后端的
Access-Control-Allow-Origin不能是*,必须写前端的具体域名(比如http://localhost:5173,根据你的前端服务端口调整) - 后端必须设置
Access-Control-Allow-Credentials: true
- 后端的
允许的HTTP方法
确保后端的Access-Control-Allow-Methods包含POST和OPTIONS(OPTIONS是浏览器自动触发的,必须明确允许)
给你一个GIN后端的正确CORS配置示例
如果你用的是gin-contrib/cors中间件,可以直接套用这个配置:
package main import ( "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 自定义CORS规则 corsConfig := cors.DefaultConfig() // 替换成你的前端实际域名/端口 corsConfig.AllowOrigins = []string{"http://localhost:5173"} // 允许需要的HTTP方法 corsConfig.AllowMethods = []string{"GET", "POST", "OPTIONS"} // 必须包含所有自定义请求头 + 默认的Content-Type corsConfig.AllowHeaders = []string{"Content-Type", "X-Timestamp", "X-Signature", "X-Nonce"} // 允许携带cookie等凭证 corsConfig.AllowCredentials = true // 设置预检结果缓存时间,减少重复OPTIONS请求 corsConfig.MaxAge = 86400 // 缓存1天 r.Use(cors.New(corsConfig)) // 你的现有路由 r.GET("/captcha", func(c *gin.Context) { // 验证码逻辑 }) r.POST("/gongdan", func(c *gin.Context) { // 工单处理逻辑 }) r.Run(":8080") }
用浏览器开发者工具验证预检响应
打开浏览器Network面板,找到OPTIONS请求,查看Response Headers:
- 确认
Access-Control-Allow-Origin是你的前端域名,不是* - 确认
Access-Control-Allow-Credentials: true存在 - 确认
Access-Control-Allow-Headers包含所有你用到的自定义头 - 确认
Access-Control-Allow-Methods包含POST
其他可能的排查点
- 检查后端是否有其他中间件(比如权限校验)拦截了OPTIONS请求:预检请求不会携带签名或token,所以不要对OPTIONS请求做权限校验
- 清空浏览器缓存再测试:有时候浏览器会缓存错误的CORS响应
- 确认前端请求头的拼写没有大小写错误:比如
X-Timestamp和后端允许的头大小写要完全一致
按这些步骤调整后,应该就能解决只发OPTIONS不发实际请求的问题了,如果还有问题,可以补充浏览器Network面板里的OPTIONS响应头信息,我再帮你分析。
备注:内容来源于stack exchange,提问作者user29250833
相关产品推荐
相关产品推荐

