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

API请求中CORS预检请求异常:仅发送OPTIONS请求无后续请求的问题求助

API请求中CORS预检请求异常:仅发送OPTIONS请求无后续请求的问题求助

看起来你遇到了一个典型的CORS预检卡壳问题——浏览器发了OPTIONS预检请求后,直接终止了后续的POST请求,甚至连其他API都只发OPTIONS不发实际请求。结合你给的代码和后端日志,我来帮你一步步排查:

核心问题大概率出在后端CORS配置上

从你的GIN日志看,OPTIONS请求返回了204,但浏览器可能认为预检响应的CORS头不符合规则,直接阻止了后续请求。重点检查这几个关键配置:

  1. 自定义请求头的权限
    你的前端请求带了X-Timestamp、X-Signature、X-Nonce这几个自定义头,后端必须在预检响应的Access-Control-Allow-Headers里明确列出这些头,否则浏览器会判定预检不通过。

  2. 带凭证的跨域规则
    你在fetch里设置了credentials: 'include',这意味着:

    • 后端的Access-Control-Allow-Origin不能是*,必须写前端的具体域名(比如http://localhost:5173,根据你的前端服务端口调整)
    • 后端必须设置Access-Control-Allow-Credentials: true
  3. 允许的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:18:00