<p>生产环境必须禁用 并显式校验 Origin 头,否则带凭证的跨域请求会静默失败;AllowCredentials 为 true 时 AllowedOrigins 不得含 ,须用具体 URL 切片或 AllowOriginFunc 动态校验,并返回 Vary: Origin 防缓存污染。</p>

生产环境必须禁用 * 并显式校验 Origin 头,否则带凭证(Cookie / Authorization)的跨域请求会静默失败,前端卡在 pending 状态,控制台无错误提示。
AllowCredentials 为 true 时 AllowedOrigins 不能含 "*"
浏览器强制要求:只要响应头中设置了 Access-Control-Allow-Credentials: "true",Access-Control-Allow-Origin 就不能是 "*",否则直接丢弃整个响应。这不是 Gin 或中间件的问题,是浏览器规范。
-
AllowedOrigins必须是具体 URL 字符串切片,例如[]string{"https://a.com", "https://b.net:8080"} - 子域名通配(如
"*.example.com")不被标准 CORS 支持,需改用AllowOriginFunc手动判断 - 协议、域名、端口必须完全一致 ——
"https://a.com"≠"https://a.com/"(尾部斜杠不影响匹配,但路径部分不参与 Origin 比较)
预检 OPTIONS 请求必须被中间件拦截,不能透传到业务 handler
非简单请求(如 Content-Type: application/json、自定义 header、PUT/DELETE 方法)触发浏览器发 OPTIONS 预检。若没被 CORS 中间件处理,就会落到路由层,返回 404 或 405,前端只报 “CORS error”,看不到真实原因。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
gin-contrib/cors默认拦截并返回204 No Content,无需额外配置 - 切勿在同一个路由上重复挂载多个 CORS 中间件(比如又用
cors.New()又手写一个),会导致响应头重复写入,触发ERR_INVALID_HTTP_RESPONSE - 若用
rs/cors,需显式设OptionsPassthrough: false,否则它默认放行OPTIONS
生产环境必须动态校验 Origin 并返回 Vary: Origin
硬编码白名单只适合开发;生产环境必须从 r.Header.Get("Origin") 动态比对,且必须返回 Vary: Origin 头,否则 CDN 或反向代理可能缓存错误的 Access-Control-Allow-Origin 值,导致不同域名拿到同一份响应。
- 推荐用
AllowOriginFunc实现校验逻辑,例如:AllowOriginFunc: func(origin string) bool { for _, allowed := range allowedOrigins { if origin == allowed { return true } } return false } - 确保
allowedOrigins切片里包含完整协议+域名+端口(如"https://admin.example.com:443") - 不要依赖
strings.HasSuffix做模糊匹配,"https://evil.com.example.com"会被"example.com"错误放过
最容易被忽略的是 Vary: Origin 和 AllowOriginFunc 的组合 —— 缺一不可。前者防缓存污染,后者防域名伪造,两者漏掉任一,上线后都可能引发偶发性跨域失败,且极难复现和定位。


















