iris路由注册必须在listen()之前,且通配路由需置于最后并排除api路径,子域名须用subdomain()显式注册。

路由注册必须在 Listen() 之前
很多人写完 app.Get() 就直接运行,结果浏览器打不开——不是路由没写对,是服务根本没启动。Iris 不会自动监听端口,iris.New() 只是初始化一个应用实例。app.Listen(":8080")(或 app.Run())必须显式调用,且得放在所有 app.Get()、app.Post() 之后。
常见错误现象:终端无日志、进程秒退、或阻塞但无响应。只要没调 Listen(),就等于没开服务器。
- 正确顺序:
app := iris.New()→app.Use(...)→app.Get(...)→app.Listen(...) -
app.Run()在 v12+ 已被标记为 deprecated,推荐用app.Listen() - 想加调试日志?传
iris.WithLogLevel("debug")到Listen()第二个参数
路径参数用 ctx.Params().Get(),别碰 ctx.URLParam()
ctx.URLParam() 是取 query string(比如 /search?keyword=go 中的 keyword),不是取路径参数。RESTful 路由如 /user/{id:uint64} 里的 id,必须走 ctx.Params().Get("id")。
拼错参数名不会 panic,而是返回空字符串,容易漏掉校验逻辑。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 带类型转换更安全:
ctx.Params().GetInt64("id"),失败时返回 error - 路径参数支持正则约束:
/user/{id:int min(1)},Iris 会在匹配阶段拦截非法值 - 若需同时读 query 和 path 参数,两个方法要分开调,不能混用
通配路由 /{path:path} 必须放最后,且要排除 API
SPA 场景下,前端路由接管 /dashboard/settings 这类路径,后端不该重定向,而应统一返回 index.html。但通配路由如果写早了,会抢在 /api/users 前面匹配,导致 API 请求也被塞进 HTML。
必须把通配路由放在所有显式路由之后,并手动过滤 API 路径。
- 注册方式:
app.Handle("GET", "/{path:path}", func(ctx iris.Context) { ... }) - 排除逻辑要写在 handler 开头:
if strings.HasPrefix(ctx.Request().URL.Path, "/api/") { ctx.StatusCode(404); return } - 别用
ctx.Redirect("/")做兜底——这会让所有 404 都跳首页,掩盖真实问题
子域名路由要用 app.Subdomain() 显式注册
想让 admin.example.com 有独立逻辑,不能只靠 ctx.Redirect("https://admin.example.com")。客户端跳转只是表面动作,真正要让子域请求进 Iris,必须提前注册子域路由树。
本地测试前还得改 /etc/hosts,否则 DNS 解析失败,跳转永远 404。
- 注册子域:
admin := app.Subdomain("admin"),然后admin.Get("/", handler) - 主站跳子域可用
ctx.Redirect("https://admin.example.com"),但前提是 HTTPS 证书有效、hosts 已绑定、且目标子域已注册 - 未注册的子域请求根本不会进 Iris,直接 404 或超时










