中间件注册必须在路由定义之前:use仅影响后续路由,useglobal作用于所有路由但不拦截静态文件;须用party分组实现路径前缀控制;中间件函数必须为func(ctx iris.context)类型并调用ctx.next()或ctx.stopexecution()。

中间件注册必须在路由定义之前
Iris 的中间件不是“挂载到某个路由上”就生效的,而是通过 Use 或 UseGlobal 注册后,对后续所有匹配的路由起作用。如果把 Use 写在 Get/Post 之后,中间件根本不会执行。
正确顺序是:
app.Use(authMiddleware) // 全局前置中间件
app.Get("/user", userHandler)
app.Post("/login", loginHandler)
-
Use:只影响注册位置之后定义的路由(按代码顺序) -
UseGlobal:影响所有路由,无论定义先后,但注意它不拦截静态文件等内置处理器(除非显式启用) - 若想只为某组路由加中间件,用
Party分组更安全,比如api := app.Party("/api").Use(jwtMiddleware)
中间件函数签名必须匹配 iris.Handler
Iris 要求中间件是 func(ctx iris.Context) 类型,不能少参数、不能多返回值,也不能用 http.HandlerFunc 替代——否则编译失败或 panic。
常见错误写法:
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
// ❌ 错误:用了 net/http 风格
func myMiddleware(w http.ResponseWriter, r *http.Request) { ... }
<p>// ✅ 正确:Iris 原生上下文
func myMiddleware(ctx iris.Context) {
ctx.Application().Logger().Info("before")
ctx.Next() // 继续链式调用
ctx.Application().Logger().Info("after")
}</p>
- 必须调用
ctx.Next()才能进入下一个处理器(包括最终路由 handler);不调则请求中断 - 调用
ctx.StopExecution()可提前终止,常用于鉴权拒绝 - 不要在中间件里直接
ctx.StatusCode(401)后就 return —— 还得配ctx.StopExecution(),否则后续 handler 仍可能执行
如何让中间件只作用于特定 HTTP 方法或路径前缀
Iris 本身不支持像 Express 那样在 Use 里传路径模式,但可以通过 Party 精确控制作用域。
例如:
admin := app.Party("/admin")
admin.Use(adminAuthMiddleware) // 仅 /admin/* 路由触发
admin.Get("/dashboard", dashboardHandler)
admin.Post("/users", createUserHandler)
<p>// 不影响 /public/* 或根路径
app.Get("/health", healthHandler)</p>
-
Party返回的是新路由组,Use对其内部所有子路由生效 - 嵌套
Party也有效:v1 := admin.Party("/v1").Use(versionCheck) - 避免用
ctx.Path()在全局中间件里手动字符串匹配路径——性能差、易漏掉路由别名或重定向场景
中间件中读写请求/响应数据的注意事项
中间件可以访问并修改 ctx.Request() 和 ctx.Response(),但要注意生命周期和并发安全。
- 修改
ctx.Request().URL.Path是允许的(如重写路由),但需在ctx.Next()前完成 - 向
ctx.Values()存数据是推荐方式(线程安全),供下游 handler 读取:ctx.Values().Set("user_id", 123) - 不要复用
ctx.Request().Body多次读取——Iris 默认不自动重放 body,需提前用ctx.ReadBody()或ctx.Request().Body+io.NopCloser缓存 - 日志中间件里打
ctx.RemoteAddr()比ctx.Request().RemoteAddr更可靠(已处理代理头)
最易被忽略的一点:中间件里抛出 panic 不会自动被 Iris 捕获为 500,除非你显式配置了 app.Use(recovery.New())。生产环境务必加上这个恢复中间件,否则一个未处理 panic 会让整个服务卡住或崩溃。










