请求路由是 Caddy HTTP 服务器的核心,它决定了如何将传入的请求与处理程序匹配。本文档解释了 Caddy 中的 HTTP 请求路由系统如何工作,从请求进入服务器的那一刻起,到它被适当的处理程序处理为止。
有关路由后处理请求的特定 HTTP 处理程序的更多信息,请参阅HTTP 处理程序。
Caddy 的路由系统是一个强大的基于规则的机制,用于确定哪些处理程序应处理每个传入的 HTTP 请求。路由按顺序进行评估,每个路由包含
来源:modules/caddyhttp/server.go264-451 modules/caddyhttp/routes.go242-301
Caddy 中的路由由 caddyhttp 包中的 Route 结构体定义。每个路由包含以下关键组件:
来源:modules/caddyhttp/routes.go29-100 modules/caddyhttp/routes.go335-451
路由被配置为一个列表,每个路由包含
JSON 中的示例路由结构
来源:modules/caddyhttp/server.go106-116 modules/caddyhttp/routes.go29-100
当 HTTP 请求进入 Caddy 时,它会经历以下流程:
来源:modules/caddyhttp/server.go264-451 modules/caddyhttp/routes.go224-301
来源:modules/caddyhttp/server.go264-451 modules/caddyhttp/caddyhttp.go59-99
匹配器决定路由是否应处理请求。Caddy 提供几种内置的匹配器类型:
| 匹配器 | 描述 | 示例 |
|---|---|---|
主机 | 按主机名匹配 | example.com、*.example.com |
path | 按请求路径匹配 | /api/*、/images/*.jpg |
path_regexp | 按正则表达式匹配路径 | ^/user/\d+$ |
method | 按 HTTP 方法匹配 | GET、POST |
query | 按查询参数匹配 | ?key=value |
header | 按 HTTP 标头匹配 | User-Agent: *Chrome* |
protocol | 按协议匹配 | http、https、h2 |
not | 反转其他匹配器 |
来源:modules/caddyhttp/matchers.go43-221
匹配器逻辑遵循以下规则:
来源:modules/caddyhttp/routes.go335-451
按 Host 标头值(不区分大小写)匹配请求。
来源:modules/caddyhttp/matchers.go44-66 modules/caddyhttp/matchers.go297-362
按 URI 路径(不区分大小写)匹配请求。
来源:modules/caddyhttp/matchers.go68-109 modules/caddyhttp/matchers.go398-534
按 HTTP 方法匹配请求。
来源:modules/caddyhttp/matchers.go121-123 modules/caddyhttp/matchers.go783-792
处理程序在路由匹配后处理请求。它们以类似中间件的方式串联在一起。
这种双向流动很重要:处理程序可以转换请求(进入时)和响应(出来时)。
来源:modules/caddyhttp/routes.go47-87 modules/caddyhttp/caddyhttp.go59-75
路由在配置和请求处理期间被编译成中间件链。
编译过程
来源: modules/caddyhttp/routes.go219-234 modules/caddyhttp/routes.go241-301
路由分组允许您定义互斥的路由。当同一组中的多个路由匹配请求时,仅执行第一个。
路由分组通过请求上下文中的一个映射进行跟踪,该映射位于 routeGroupCtxKey 键下,其中包含已满足的分组。
来源: modules/caddyhttp/routes.go29-35 modules/caddyhttp/routes.go269-282
当处理程序返回错误时,Caddy 的错误处理系统将被激活。
错误处理系统
来源: modules/caddyhttp/server.go386-450 modules/caddyhttp/server.go689-731
Caddy 的请求路由系统效率很高。
匹配器优化:
编译策略:
延迟评估:
来源: modules/caddyhttp/matchers.go256-395 modules/caddyhttp/routes.go219-234
路由系统与其他 Caddy 部分集成。
这些集成使路由系统具有可扩展性和强大功能,能够实现复杂的路由规则和 HTTP 处理。
来源: modules/caddyhttp/server.go307-359 modules/caddyhttp/replacer.go58-386