HEAD路由必须显式注册,不能靠GET自动fallback;OPTIONS路由需区分手动注册与CORS中间件自动处理;禁用app.Any替代明确方法注册;测试时应隔离中间件干扰。

HEAD路由必须显式注册,不能靠GET自动 fallback
Iris 不会像某些框架那样为每个 GET 路由自动提供同路径的 HEAD 实现。如果你需要支持健康检查、缓存探测或 CORS 预检(虽然 OPTIONS 更常用),就必须手动调用 app.Head() 注册。
常见错误是只写 app.Get("/health", handler) 就以为 HEAD /health 也能返回 200 —— 实际发 HEAD 请求会直接 404。
-
app.Head("/health", func(ctx iris.Context) { ctx.StatusCode(200) })是最简写法,不写响应体,仅设状态码 - 若需复用逻辑,可把处理函数抽成变量:
healthHandler := func(ctx iris.Context) { ... },再分别传给app.Get和app.Head - 注意:HEAD 响应头(如
Content-Length、ETag)会被 Iris 自动推导,但不会执行ctx.Write()类方法 —— 即使写了也无效
OPTIONS 路由要区分“手动注册”和“CORS 自动处理”
如果你只是想响应前端发来的 CORS 预检请求,不要手写 app.Options() —— Iris 的 iris.CORS 中间件已内置处理,且更安全(自动设置 Access-Control-Allow-Methods 等头)。
只有在两种场景下才需显式注册 OPTIONS:
- 提供自定义的 API 探测端点,比如
OPTIONS /api返回支持的方法列表 - 某些老旧客户端(非浏览器)主动发
OPTIONS请求做能力协商
示例:app.Options("/api", func(ctx iris.Context) { ctx.JSON(map[string][]string{"allowed": {"GET", "POST", "PUT"}}) })
⚠️ 注意:如果同时用了 iris.CORS 中间件,又手动注册了同路径的 OPTIONS,后者会覆盖前者 —— 预检可能失效,因为中间件的自动响应逻辑被跳过了。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
多个 HTTP 方法共用同一处理器时别偷懒用通配
有人试图用 app.Any("/path", handler) 来一揽子支持所有方法,这在调试阶段看似省事,但实际会掩盖问题:
-
Any不会区分HEAD和GET语义,导致缓存探测失败(HEAD 应无 body,Any却可能返回内容) - CORS 预检要求
OPTIONS必须精确响应特定 header,Any默认不设这些头 - API 文档工具(如 Swagger)无法从
Any推断出真实支持的方法集
正确做法是按需明确注册:app.Get、app.Post、app.Head、app.Options 各司其职,哪怕它们调用同一个内部函数。
测试 HEAD/OPTIONS 路由前先关掉中间件干扰
开发时容易忽略的是:全局中间件(如日志、鉴权)也会作用于 HEAD 和 OPTIONS 请求。而很多中间件在 HEAD 下仍尝试读取请求体、或对 OPTIONS 做权限校验,导致本该快速返回的探测请求变慢甚至失败。
建议在本地验证时临时绕过:
- 用
app.Party("/probe").Get("/health", ...).Head("/health", ...)隔离探测路由 - 对该
Party不调用Use(),避免中间件污染 - 上线前再把探测路由合并进主路由树,并确认中间件逻辑对
HEAD/OPTIONS是 safe 的(比如鉴权中间件遇到OPTIONS应直接ctx.Next()而非校验 token)
HEAD 和 OPTIONS 看似简单,但它们的语义约束比 GET/POST 更严格;漏掉一个 Head() 或错配 Options(),前端就可能卡在预检环节不动。










