iris无内置cors中间件,必须手动注册options路由并显式处理预检请求,否则因404/405导致浏览器中断跨域流程;关键在于路由匹配优先于中间件执行,未注册options handler则中间件根本不会运行。

直接给结论:Iris 没有内置的 CORS 中间件,必须手动写中间件或用第三方包,且 OPTIONS 预检请求必须显式注册,否则 405 或静默失败。
为什么 Iris 的跨域配置容易失效
Iris 默认不拦截 OPTIONS 请求,前端发预检时若路由没匹配到 handler,就会返回 404 或 405;而浏览器看到非 2xx 响应就直接中断,不会继续发真实请求。这不是 header 没加对,是根本没走到你写的中间件里。
- 常见错误现象:
Failed to load http://localhost:8080/api/user: Response to preflight request doesn't pass access control check - 关键原因:没为
OPTIONS方法注册任何 handler,ctx.Next()不会执行,中间件里的ctx.Header根本没机会运行 - 必须在所有可能被跨域访问的路由组上,显式调用
.Options("*", ...)或具体路径
手写 CORS 中间件的最小可靠写法
不要只设 Access-Control-Allow-Origin: "*",预检响应必须包含 Allow-Methods 和 Allow-Headers,且需提前终止 OPTIONS 请求。
- 用
ctx.Method() == "OPTIONS"判断预检,不是靠ctx.Request().Method - 必须调用
ctx.StatusCode(204)并return,不能漏掉return,否则会继续执行后续 handler - 允许的 headers 建议写死(如
"Content-Type, Authorization"),避免通配符*在带 credentials 时被浏览器拒绝 - 示例片段:
func Cors(ctx iris.Context) {
ctx.Header("Access-Control-Allow-Origin", "http://localhost:3000") // 不要用 "*" + credentials
ctx.Header("Access-Control-Allow-Credentials", "true")
ctx.Header("Access-Control-Expose-Headers", "X-Total-Count")
if ctx.Method() == "OPTIONS" {
ctx.Header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,PATCH,OPTIONS")
ctx.Header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With")
ctx.StatusCode(204)
return
}
ctx.Next()
}
Party 路由组上必须补 OPTIONS 注册
中间件只控制请求流程,不自动注册 HTTP 方法。即使你用了 app.Use(Cors),如果 /api 下没有 .Options,预检仍 404。
- 正确做法:在每个
Party上补一句.Options("*", func(ctx iris.Context) { ctx.StatusCode(204) }) - 别偷懒写
app.Options("*", ...)—— 它只作用于根路径,子路由不继承 - 如果 API 路径固定(如只用
/api/users),可写具体路径:api.Options("/users", ...),更安全 - 注意:Iris 的
Party是前缀匹配,common.Options("*", ...)确实能覆盖所有子路径,但需确保它在Use之后、其他路由之前注册
容易被忽略的细节
跨域问题常在开发环境“看起来正常”,上线后突然崩 —— 因为生产环境通常启用了 credentials(如 cookie 或 auth header),而 Access-Control-Allow-Origin: "*" 和 credentials: true 是互斥的。
- 前后端域名必须精确匹配,比如前端是
https://app.example.com,后端 header 就得写https://app.example.com,不能用* -
Access-Control-Max-Age不是必需项,但设成86400可减少重复预检 - 如果你用 Nginx 做反向代理,别在 Nginx 层加 CORS header —— Iris 中间件和 Nginx 同时设会导致 header 冲突或重复











