Traefik HTTP 路由规则与优先级
路由规则与优先级
HTTP 路由器负责将传入请求连接到可以处理它们的服务。Traefik 允许你定义匹配规则并为路由设置优先级。
规则(Rules)
规则是一组配置了值的匹配器,用于确定特定请求是否符合特定条件。如果规则验证通过,路由器会激活,调用中间件,然后将请求转发到服务。
- 路由器名中不能包含字符
@。 - 要设置规则的值,请使用反引号
`或转义双引号\"。 - 不接受单引号
',因为值是 Go 的字符串字面量。 - 正则表达式:
- 接受 regexp 作为值的匹配器使用 Go 风格的语法。
- 可以使用通常的
AND(&&) 和OR(||) 逻辑运算符,具有预期的优先级规则,也可以使用括号表示复杂规则。 NOT(!) 运算符允许你反转匹配器。
可用的匹配器
| 匹配器 | 描述 |
|---|---|
Header(key, value) | 匹配包含 key 头的请求,其值设置为 value。 |
HeaderRegexp(key, regexp) | 匹配包含 key 头的请求,其值匹配 regexp。 |
Host(domain) | 匹配主机头设置为 domain 的请求。支持通配符子域匹配(如 *.example.com)。 |
HostRegexp(regexp) | 匹配主机头匹配 regexp 的请求。 |
Method(method) | 匹配方法设置为 method 的请求。 |
Path(path) | 匹配路径设置为 path 的请求(精确匹配)。 |
PathPrefix(prefix) | 匹配路径前缀为 prefix 的请求。 |
PathRegexp(regexp) | 使用 regexp 匹配请求路径。 |
Query(key, value) | 匹配查询参数 key 设置为 value 的请求。 |
QueryRegexp(key, regexp) | 匹配查询参数 key 匹配 regexp 的请求。 |
ClientIP(ip) | 匹配客户端 IP 为 ip 的请求。支持 IPv4、IPv6 和 CIDR 格式。 |
规则示例
Host(主机名)
yaml
# 匹配特定主机
rule: "Host(`example.com`)"
# 匹配通配符子域
rule: "Host(`*.example.com`)"PathPrefix(路径前缀)
yaml
# 匹配以 /api 开头的所有路径
rule: "PathPrefix(`/api`)"Method(HTTP 方法)
yaml
# 仅匹配 GET 请求
rule: "Method(`GET`)"复合规则
yaml
# 多个条件组合
rule: "Host(`example.com`) && PathPrefix(`/api`)"
# 或关系
rule: "Host(`example.com`) || Host(`example.org`)"
# 反向
rule: "!Host(`internal.example.com`)"带正则的 Header
yaml
# 匹配 User-Agent 头
rule: "HeaderRegexp(`User-Agent`, `^Mozilla/.*`)"优先级(Priority)
路由器可以拥有 priority 选项,它在选择匹配传入请求的路由器时发挥作用。
priority 仅在同一入口点上声明的路由器之间考虑。
- 数值越大,优先级越高。
- 默认优先级为 0。
- 显式优先级通常不需要,但如果你的路由规则有重叠,或要为通用规则设置 catchall 时会很有用。
优先级示例
yaml
http:
routers:
# 高优先级:精确路径
api-v2:
rule: "Host(`example.com`) && Path(`/api/v2`)"
priority: 100
service: api-v2
# 低优先级:catchall
all:
rule: "Host(`example.com`)"
priority: 1
service: default匹配顺序
- 路由器按
priority(从高到低)评估。 - 第一个匹配请求的路由器将处理该请求。
- 如果没有路由器匹配,Traefik 返回 404 Not Found。
在生产环境使用 Traefik OSS?
如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。