最直接方式是用 c.request.url.path 判断路径,全局中间件需手动放行公开路由(如 /login、/health),避免误拦截;跳过逻辑须在 next(c) 前 return,且应置于 post-router 层(e.use)而非 e.pre()。

中间件里用 c.Request().URL.Path 判断路径最直接
全局中间件(e.Use() 注册的)会拦截所有请求,包括 /login、/health 这类公开路由。跳过不是靠“排除列表”,而是手动在中间件逻辑里放行。
常见错误是只检查 Auth::check()(这是 Laravel 的写法),而 Echo 没有 Auth 类——你得自己读请求路径:
-
c.Request().URL.Path == "/login"或strings.HasPrefix(c.Request().URL.Path, "/public/") - 避免用
strings.Contains()匹配子串,比如"/admin"会误中/admin-api/users - 注意路径是否带前缀:如果注册的是
e.GET("/api/v1/health", ...),那实际路径是/api/v1/health,不是/health - GET 请求才放行登录页;POST /login 必须继续走后续逻辑,否则表单提交失败
echo.New() 后注册的中间件顺序决定能否跳过
中间件执行是链式调用:m1 → m2 → handler → m2 defer → m1 defer。跳过必须发生在「进入下一个中间件之前」,也就是在 next(c) 调用前 return。
典型结构如下:
func skipPublicRoutes(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
path := c.Request().URL.Path
method := c.Request().Method
if (path == "/login" || path == "/register") && method == "GET" {
return next(c) // 显式放行,不重定向
}
if path == "/health" {
return c.NoContent(http.StatusOK)
}
// 其他逻辑,比如鉴权
if !isAuthenticated(c) {
return c.Redirect(http.StatusFound, "/login")
}
return next(c)
}
}
关键点:
- 必须用
return next(c),不是next(c);后者只是调用,不终止当前函数 -
c.NoContent()或c.String()等响应方法一旦执行,后续中间件和 handler 就不会触发 - 别把跳过逻辑写在
defer里——那是清理阶段,响应头可能已发
别在 Root Level(Pre-router)中间件里做路径判断
e.Pre() 注册的中间件运行在路由匹配之前,此时 c.ParamNames()、c.Param("id") 都不可用,c.Request().URL.Path 虽然能读,但无法知道该请求最终会落到哪个 handler 上。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
这意味着你没法基于业务语义跳过,比如「所有 /api/v1/users/* 下的 GET 不鉴权」这种规则,在 Pre-router 层只能靠字符串硬匹配,极易出错。
正确做法:
- 跳过逻辑统一放在
e.Use()注册的中间件里(即 Post-router 层) - 需要更细粒度控制时,改用路由分组:
publicGroup := e.Group("")不挂鉴权中间件,authGroup := e.Group("/api")挂authMiddleware -
e.Pre()只做请求预处理,如标准化路径尾部斜杠、Method override
跳过逻辑漏判会导致无限重定向或 404
最常被忽略的是 OPTIONS 预检请求。如果你的 CORS 中间件在鉴权中间件之后,而鉴权中间件对 OPTIONS /api/v1/users 返回了 302 跳转到 /login,浏览器就会拒绝该跨域请求——Network 面板只显示空响应或 404,根本看不到重定向过程。
所以跳过列表里必须包含:
-
OPTIONS方法的所有路径(尤其当用了middleware.CORSWithConfig) - 健康检查路径(
/health、/ready) - 静态资源路径(
/img/*、/css/*),除非你本意就是鉴权静态文件 - WebSocket 升级路径(
/ws),它必须在升级前完成鉴权,且不能走常规中间件链
路径判断这一步看着简单,但漏掉任意一个边缘 case,线上就容易出现用户打不开登录页、前端收不到 API 响应这类“查不出原因”的问题。










