iris中手动写cors中间件常见错误是无条件设置access-control-allow-origin: "*",与access-control-allow-credentials: true冲突;正确做法是动态匹配origin并仅对可信源开启凭据,且options请求需显式注册路由(如app.any)或单独处理,避免404。

iris 中手动写 CORS 中间件的常见错误
直接在 Cors 中间件里无条件写死 Access-Control-Allow-Origin: "*" 看似简单,但会和 Access-Control-Allow-Credentials: true 冲突——浏览器一旦看到后者,就拒绝接受 * 作为源,必须指定具体域名。很多开发者卡在这一步,前端报错 “The value of the 'Access-Control-Allow-Origin' header must not be the wildcard '*' when the request's credentials mode is 'include'”。
正确做法是:先检查请求头里的 Origin,再动态回写该值(或白名单匹配),同时只对可信源才设置 credentials。
- 不要在所有请求上都加
ctx.Header("Access-Control-Allow-Credentials", "true") - 避免在非
OPTIONS请求中重复设置Allow-Methods和Allow-Headers,这些只应在预检响应中出现 - 别忘了对
OPTIONS请求调用ctx.StatusCode(204)并return,否则后续中间件或 handler 还会执行
为什么 iris.Use(Cors) 后 OPTIONS 请求仍 404
iris 默认不自动注册任何 OPTIONS 路由,哪怕你写了中间件。中间件只作用于已注册的路由方法(如 GET、POST),而浏览器发起的预检请求是独立的 OPTIONS 方法,若没显式注册对应路由,就会落到 404。
解决方式只有两种:
- 为每个需要跨域的路由手动补一个
app.OPTIONS("/path", func(ctx iris.Context) { ... }) - 更推荐:用
app.Any("/path", corsHandler)或全局捕获app.Any("/*path", corsHandler),让Any拦截所有方法(含OPTIONS)
注意:app.Use(Cors) 只影响后续注册的路由,它本身不创建路由;app.Any 是真正注册了路由,能响应 OPTIONS。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
iris 路由层级对 CORS 的影响
iris 的 APIBuilder 和 Router 分离设计意味着:中间件作用范围取决于你把它挂在哪一层。比如:
-
app.Use(Cors)→ 全局中间件,对所有路由生效(但不处理未注册的OPTIONS) -
app.Party("/api").Use(Cors)→ 仅对/api下子路由生效 -
app.Get("/user", Cors, handler)→ 仅对该GET路由生效,OPTIONS /user仍需单独注册
容易被忽略的是:如果你在 Party 下注册了 Get 和 Post,但没注册 OPTIONS,那么预检请求依然失败——CORS 不是“有中间件就行”,它依赖完整的 HTTP 方法覆盖。
生产环境必须改掉的三个默认值
开发时用 "*" 和 true 很方便,但上线前这三项必须收紧:
-
Access-Control-Allow-Origin:从"*"改为明确的域名数组(如[]string{"https://myapp.com", "https://staging.myapp.com"}),并做Origin匹配 -
Access-Control-Allow-Methods:不要用"GET,POST,PUT,DELETE,PATCH,OPTIONS"全开,只放当前接口实际需要的(如用户登录只需POST) -
Access-Control-Allow-Headers:避免"*",列出真实需要的头,比如"Content-Type, Authorization, X-Request-ID"
最关键的一点:iris 没有内置白名单校验逻辑,所有判断都得你自己写进中间件。漏掉 Origin 校验或硬编码 "*",等于把后端暴露给任意站点的 JS 脚本。










