Skip to content

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

匹配顺序

  1. 路由器按 priority(从高到低)评估。
  2. 第一个匹配请求的路由器将处理该请求。
  3. 如果没有路由器匹配,Traefik 返回 404 Not Found。

在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。

基于 MIT 协议发布