iris 中间件仅在匹配已注册路由时执行,而预检 options 请求需显式注册(如 app.options 或 app.any),否则请求不进中间件链导致 404;仅 app.use(corsmiddleware) 无效。

Iris 没有内置 CORS 中间件,必须手动组合 app.Use + 显式 OPTIONS 路由才能生效;只写中间件不注册 OPTIONS,前端预检请求直接 404。
为什么 Cors 中间件单独 app.Use() 不起作用
Iris 的中间件只在匹配到已注册的路由时才执行。浏览器发起跨域请求前,会先发一个独立的 OPTIONS 请求做预检,而 Iris 默认不自动注册任何 OPTIONS 路由——哪怕你在中间件里写了 if ctx.Method() == "OPTIONS",只要没显式调用 app.OPTIONS 或 app.Any,这个请求根本不会进入中间件链。
- 错误做法:
app.Use(corsMiddleware)后没注册任何OPTIONS→ 前端控制台报错Response to preflight request doesn't pass access control check - 正确做法:对目标路径(如
/api/*)显式注册app.Options("/api/*", corsHandler),或更通用的app.Any("/*path", corsHandler) -
app.Use只影响后续注册的路由,它本身不创建路由;app.Any是真正注册了路由,能响应所有方法(含OPTIONS)
Access-Control-Allow-Origin 和 credentials 冲突怎么避
当前端请求带 credentials: 'include'(比如发送 Cookie 或 Authorization header),浏览器强制要求 Access-Control-Allow-Origin 不能是 "*",否则直接拒绝响应。
- 开发环境可临时用
"*",但上线前必须替换为白名单校验逻辑 - 从请求头读取
Origin:origin := ctx.Request().Header.Get("Origin") - 比对预设白名单:
allowedOrigins := []string{"https://example.com", "http://localhost:3000"},注意协议、端口、结尾斜杠都要完全一致 - 若
origin为空或不在白名单内,应返回403,而不是默认放行 - 仅对可信源才设置
ctx.Header("Access-Control-Allow-Credentials", "true"),且此时Access-Control-Allow-Origin必须是该origin字符串本身
OPTIONS 预检响应要设哪些头、怎么终止
预检响应不是“转发给业务 handler”,而是由中间件直接处理并结束请求链。漏掉关键头或没正确终止,会导致浏览器继续等待、超时或报错。
- 必须设置:
Access-Control-Allow-Methods(如"GET,POST,PUT,DELETE,OPTIONS")、Access-Control-Allow-Headers(如"Content-Type,Authorization,X-Auth-Token") - 推荐设置:
Access-Control-Max-Age(减少重复预检)、Access-Control-Expose-Headers(暴露自定义响应头给前端 JS 读取) - 必须调用
ctx.StatusCode(204)并立即return,不能调用ctx.Next(),否则后续中间件和 handler 还会执行 - 不要在非
OPTIONS请求中重复设置Allow-Methods和Allow-Headers,这些只应在预检响应中出现
路由分组下 CORS 怎么挂才生效
Iris 的 Party 是独立路由分组,中间件作用域严格按注册位置决定。在根级 app.Use(Cors),不会自动覆盖子分组未显式注册的 OPTIONS。
- 如果 API 在
api := app.Party("/api")下,必须在该分组内注册OPTIONS:api.Options("*", corsHandler) - 不能只在根级写
app.Options("/api/*", corsHandler)就认为覆盖了所有/api子路径——Iris 的路由匹配是精确的,/api/*和/api/v1/user是两个不同 pattern - 更稳妥的做法:用
api.Any("*", corsHandler)拦截该分组下所有方法,包括OPTIONS - 注意
app.Party("/api").Use(Cors)只让Cors对该分组下的GET/POST等路由生效,仍需额外注册OPTIONS
最容易被忽略的是:CORS 头必须在响应写出前设置,app.Done 无法修改 Header;而 OPTIONS 的 204 响应必须彻底终止链路,否则 ctx.Next() 之后的 handler 仍可能 panic 或写入冲突内容。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











