Traefik HTTP中间件(三).md

2022-05-11 23:31:35 浏览数 (2)

1.概述

附加到路由器的中间件是一种在请求发送到您的服务之前(或在服务的答案发送到客户端之前)调整请求的方法。 Traefik 中有几个可用的中间件,有的可以修改请求、headers,有的负责重定向,有的添加认证等等。 使用相同协议的中间件可以组合成链以适应各种场景。

1.1可用的中间件

中间件

目的

区域

AddPrefix

添加一个路径前缀

路径修改器

BasicAuth

添加基本认证

安全、认证

Buffering

缓冲请求/应答

请求生命周期

Chain

结合多个中间件

其他的

CircuitBreaker

防止调用不健康的服务

请求生命周期

Compress

压缩响应

内容修饰符

ContentType

处理 Content-Type 内容类型的自动检测

其他的

DigestAuth

增加摘要认证

安全、认证

Errors

自定义错误页面

请求生命周期

ForwardAuth

代表身份验证

安全、认证

Headers

添加/更新Headers头

安全

IPWhiteList

限制允许的IP

安全、请求生命周期

InFlightReq

限制同时连接的数量

安全、请求生命周期

PassTLSClientCert

在Headers头中添加Client证书

安全

RateLimit

限制调用频率

安全、请求生命周期

RedirectScheme

基于方案的重定向

请求生命周期

RedirectRegex

基于正则表达式的重定向

请求生命周期

ReplacePath

改变请求路径

路径修改器

ReplacePathRegex

正则改变请求路径

路径修改器

Retry

发生错误时自动重试

请求生命周期

StripPrefix

改变请求路径

路径修改器

StripPrefixRegex

正则改变请求路径

路径修改器

2.Headers

管理请求/响应报头

报头中间件管理请求和响应的报头。默认情况下,会自动添加一组转发的标题。更多请看 FAQ .

2.1配置示例

2.1.1向请求和响应添加header

下面的示例将X-Script-Name头添加到代理请求中,将X-Custom-Response-Header头添加到响应中

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-header
spec:
  headers:
    customRequestHeaders:
      X-Script-Name: "test"
    customResponseHeaders:
      X-Custom-Response-Header: "value"
2.1.2添加和删除头信息

在下面的示例中,请求使用一个额外的X-Script-Name头进行代理,同时去掉它们的X-Custom-Request-Header头,而响应则去掉它们的X-Custom-Response-Header头.

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-header
spec:
  headers:
    customRequestHeaders:
      X-Script-Name: "test" # 添加
      X-Custom-Request-Header: "" # 移除
    customResponseHeaders:
      X-Custom-Response-Header: "" # 移除
2.1.3使用安全Headers

安全相关的报头(HSTS headers,浏览器XSS过滤器等)可以像上面所示的那样管理自定义报头。通过添加标题,这个功能可以方便地使用安全特性.

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-header
spec:
  headers:
    frameDeny: true
    browserxssfilter: true
2.1.4跨域 CORS Headers

CORS (Cross-Origin Resource Sharing) (跨源资源共享)headers,可以以类似于上述自定义标头的方式进行添加和配置。这一功能允许快速设置更高级的安全功能。如果设置了CORS头,那么中间件不会将预检请求传递给任何服务,相反,响应将被生成并直接发回给客户端。

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-header
spec:
  headers:
    accessControlAllowMethods:
      - "GET"
      - "OPTIONS"
      - "PUT"
    accessControlAllowOriginList:
      - "https://foo.bar.org"
      - "https://example.org"
    accessControlMaxAge: 100
    addVaryHeader: true

2.2配置选项

2.2.1常规

注意:

  • 如果现有头文件具有相同的名称,则自定义头文件将覆盖它们。
  • 关于安全头的详细文档可以在unrolled/secure.
2.2.2customRequestHeaders

customRequestHeaders选项列出了要应用于请求的报头名称和值

2.2.3customResponseHeaders

customResponseHeaders选项列出要应用于响应的报头名称和值

2.2.4accessControlAllowCredentials

accessControlAllowCredentials指示请求是否可以包含用户凭据

2.2.5accessControlAllowHeaders

accessControlAllowHeaders指出哪些报头字段名可以用作请求的一部分

2.2.6accessControlAllowMethods

accessControlAllowMethods指示在请求期间可以使用哪些方法

2.2.7accessControlAllowOriginList
  • accessControlAllowOriginList指示是否可以通过返回不同的值来共享资源
  • 还可以配置通配符 *,并匹配所有请求。如果该值是后端服务设置的,则会被Traefik覆盖
  • 该值可以包含允许的源的列表
  • 更多信息,包括如何使用设置可以找到
    • Mozilla.org
    • w3
    • IETF
  • Traefik不再支持空值,因为不再建议将其作为返回值
2.2.8accessControlAllowOriginListRegex

accessControlAllowOriginListRegex选项是与accessControlAllowOriginList选项对应的正则表达式选项,而不是原始值。它允许在accessControlAllowOriginList中包含正则表达式的任何匹配的所有源.

提示:

  • 正则表达式和替换可以使用在线工具,如Go Playground或Regex101进行测试。
  • 在YAML中定义正则表达式时,任何转义字符都需要转义两次: example.com需要写成 example.com。
2.2.9accessControlExposeHeaders

accessControlExposeHeaders指示哪些头是可以安全公开给CORS api规范的api的

2.2.10addVaryHeader

addVaryHeaderaccessControlAllowOriginList一起使用,以确定是否应该添加或修改Vary报头,以证明服务器响应可以根据原始报头的值而不同.

2.2.11allowedHosts

allowedHosts选项列出了允许的完全限定的域名

2.2.12hostsProxyHeaders

hostsProxyHeaders选项是一组头键,其中可能包含请求的代理主机名值

2.2.13sslRedirect

提示:已弃用,转而使用ntryPoint redirection or the RedirectScheme middleware

当设置为true时,sslRedirect只允许HTTPS请求

2.2.14sslTemporaryRedirect

提示:已弃用,转而使用ntryPoint redirection or the RedirectScheme middleware

将sslTemporaryRedirect设置为true以强制使用302(而不是301)进行SSL重定向

2.2.15sslHost

提示:已弃用,转而使用RedirectRegex middleware.

sslHost选项是用于将HTTP请求重定向到HTTPS的主机名

2.2.16sslProxyHeaders

sslProxyHeaders选项是一组标头键,它们带有指示有效HTTPS请求的相关值。当使用其他代理时它可能很有用(例如:"X-Forwarded-Proto":"https")

2.2.17sslForceHost

提示:已弃用,转而使用RedirectRegex middleware.

sslForceHost设置为true,并设置sslHost强制请求使用sslHost,而不管它们是否已经使用SSL.

2.2.18stsSeconds

stsSecondsStrict-Transport-Security报头的最大age。如果设置为0,则不设置报头.

2.2.19stsIncludeSubdomains

如果stsincluubdomains设置为true,则incluubdomains指令会被追加到Strict-Transport-Security报头.

2.2.20stsPreload

设置stsPreloadtrue,将preload标志附加到Strict-Transport-Security报头

2.2.21forceSTSHeader

设置forceSTSHeadertrue,即使连接是HTTP也可以添加STS头

2.2.22frameDeny

设置frameDenytrue,添加值为DENYX-Frame-Options报头

2.2.23customFrameOptionsValue

customFrameOptionsValue允许使用自定义值设置X-Frame-Options报头值。这将覆盖FrameDeny选项

2.2.24contentTypeNosniff

设置contentTypeNosniff为true,以添加值为nosniffX-Content-Type-Options报头

2.2.25browserXssFilter

browserXssFilter设为true,以增加X-XSS-Protection头的值1;mode=block

2.2.26customBrowserXSSValue

customBrowserXssValue选项允许使用自定义值设置X-XSS-Protection头值。这将覆盖BrowserXssFilter选项.

2.2.27contentSecurityPolicy

contentSecurityPolicy选项允许Content-Security-Policy报头值设置为自定义值

2.2.28publicKey

publicKey通过HPKP协议防止伪造证书的MITM攻击

2.2.29referrerPolicy

referrerPolicy允许站点控制浏览器是否将Referer头转发给其他站点

2.2.30featurePolicy

提示:已弃用,转而使用permissionpolicy

featurePolicy允许站点控制浏览器特性

2.2.31permissionsPolicy

permissionpolicy允许站点控制浏览器特性

2.2.32isDevelopment

在开发时将isDevelopment设置为true,以减轻AllowedHosts、SSL和STS选项带来的不必要的影响。通常,测试是使用HTTP,而不是HTTPS,并且是在localhost,而不是你的生产域。如果你想让你的开发环境模仿生产环境,有完整的主机封锁、SSL重定向和STS头文件,请将此设置为false.

3.IPWhiteList

限制客户端使用特定ip

IPwhitelist接受 /拒绝基于客户端IP的请求

3.1配置示例

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ipwhitelist
spec:
  ipWhiteList:
    sourceRange:
      - 127.0.0.1/32
      - 192.168.1.7

3.2配置选项

3.2.1 sourceRange

sourceRange选项设置允许的ip地址(或使用CIDR表示法允许的ip地址范围).

3.2.2 ipStrategy

ipStrategy选项定义了两个参数,用于设置Traefik如何确定客户端IP: depthexcludedip.

ipStrategy.depth

depth选项告诉Traefik使用X-Forwarded-For报头并获取位于depth位置的IP(从右侧开始).

  • 如果深度大于X-Forwarded-For中的IP总数,则客户端IP为空
  • 如果深度的值小于或等于0,则忽略深度

depth和X-Forwarded-For的例子:如果深度设置为2,请求X-Forwarded-For的头部是“10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1”,那么真正的客户端IP是“10.0.0.1”(深度4),但是用于白名单的IP是“12.0.0.1”(深度2)

X-FORWARDED-FOR

DEPTH

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

1

"13.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

3

"11.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

5

""

代码语言:javascript复制
# 基于depth=2的X-Forwarded-For的白名单
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ipwhitelist
spec:
  ipWhiteList:
    sourceRange:
      - 127.0.0.1/32
      - 192.168.1.7
    ipStrategy:
      depth: 2
ipStrategy.excludedIPs

excludedIPs配置Traefik扫描X-Forwarded-For报头,并选择第一个不在列表中的IP 提示:如果指定了depth,则忽略excludedip

excludedIPsX-Forwarded-For示例:

X-FORWARDED-FOR

EXCLUDEDIPS

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"12.0.0.1,13.0.0.1"

"11.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"15.0.0.1,13.0.0.1"

"12.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"10.0.0.1,13.0.0.1"

"12.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"15.0.0.1,16.0.0.1"

“13.0.0.1"

"10.0.0.1,11.0.0.1"

"10.0.0.1,11.0.0.1"

""

代码语言:javascript复制
# Exclude from `X-Forwarded-For`
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ipwhitelist
spec:
  ipWhiteList:
    ipStrategy:
      excludedIPs:
        - 127.0.0.1/32
        - 192.168.1.7

4.InFlightReq

限制同时请求的数量

为了主动防止服务因高负载而不堪重负,可以限制允许同时进行的在线请求的数量。

4.1配置示例

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    amount: 10

4.2配置选项

4.2.1 amount

amount选项定义允许同时进行的请求的最大数量。如果已经有大量的请求在进行中(基于相同的sourceCriterion策略),中间件将以HTTP 429 Too Many Requests响应.

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    amount: 10
4.2.2 sourceCriterion

sourceCriterion选项定义了用什么标准将请求分组为来自一个共同的来源。如果同时定义了几个策略,将产生一个错误。如果没有设置,默认是使用 requestHost

sourceCriterion.ipStrategy

ipStrategy选项定义了两个参数,用于配置Traefik如何确定客户的IP:depthexcludedIPs排除的IP

IPSTRATEGY.DEPTH

depth选项告诉Traefik使用X-Forwarded-For报头并获取位于depth位置的IP(从右侧开始).

  • 如果depth大于X-Forwarded-For中的IP总数,则客户端IP为空
  • 如果深度的值小于或等于0,则忽略深度

depth和X-Forwarded-For的例子:如果深度设置为2,请求X-Forwarded-For的头部是“10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1”,那么真正的客户端IP是“10.0.0.1”(深度4),但是用于白名单的IP是“12.0.0.1”(深度2)

X-FORWARDED-FOR

DEPTH

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

1

"13.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

3

"11.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

5

""

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    sourceCriterion:
      ipStrategy:
        depth: 2
IPSTRATEGY.EXCLUDEDIPS

excludedIPs配置Traefik扫描X-Forwarded-For报头,并选择第一个不在列表中的IP 提示:如果指定了depth,则忽略excludedip

excludedIPsX-Forwarded-For示例:

X-FORWARDED-FOR

EXCLUDEDIPS

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"12.0.0.1,13.0.0.1"

"11.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"15.0.0.1,13.0.0.1"

"12.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"10.0.0.1,13.0.0.1"

"12.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

"15.0.0.1,16.0.0.1"

“13.0.0.1"

"10.0.0.1,11.0.0.1"

"10.0.0.1,11.0.0.1"

""

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    sourceCriterion:
      ipStrategy:
        excludedIPs:
        - 127.0.0.1/32
        - 192.168.1.7
sourceCriterion.requestHeaderName

用于对传入请求进行分组的报头的名称

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    sourceCriterion:
      requestHeaderName: username
sourceCriterion.requestHost

是否考虑将请求主机作为源

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    sourceCriterion:
      requestHost: true

5.PassTLSClientCert

在Header中添加客户端证书 PassTLSClientCert将从传递的客户端TLS证书中选择的数据添加到Header

5.1配置示例

在X-Forwarded-Tls-Client-Cert头中传递转义的pem

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-passtlsclientcert
spec:
  passTLSClientCert:
    pem: true

传递X-Forwarded-Tls-Client-Cert标题中的所有可用信息

代码语言:javascript复制
# 传递X-Forwarded-Tls-Client-Cert标题中的所有可用信息
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-passtlsclientcert
spec:
  passTLSClientCert:
    info:
      notAfter: true
      notBefore: true
      sans: true
      subject:
        country: true
        province: true
        locality: true
        organization: true
        organizationalUnit: true
        commonName: true
        serialNumber: true
        domainComponent: true
      issuer:
        country: true
        province: true
        locality: true
        organization: true
        commonName: true
        serialNumber: true
        domainComponent: true

5.2配置选项

5.2.1 常规配置

PassTLSClientCert可以向请求添加两个头:

  • X-Forwarded-Tls-Client-Cert包含转义的pem
  • X-Forwarded-Tls-Client-Cert-Info在一个转义字符串中包含所有选定的证书信息

提示:

  • 每个头的值都是一个字符串,为了成为一个有效的URL查询,已经被转义了.
  • 这些选项只对 MutualTLS configuration配置起作用。也就是说,只有符合clientAuth.clientAuthType策略的证书才能被传递.

下面的例子显示了一个完整的证书,并解释了每个中间件的选项:

代码语言:javascript复制
# 完整的客户端TLS证书
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: DC=org, DC=cheese, O=Cheese, O=Cheese 2, OU=Simple Signing Section, OU=Simple Signing Section 2, CN=Simple Signing CA, CN=Simple Signing CA 2, C=FR, C=US, L=TOULOUSE, L=LYON, ST=Signing State, ST=Signing State 2/emailAddress=simple@signing.com/emailAddress=simple2@signing.com
        Validity
            Not Before: Dec  6 11:10:16 2018 GMT
            Not After : Dec  5 11:10:16 2020 GMT
        Subject: DC=org, DC=cheese, O=Cheese, O=Cheese 2, OU=Simple Signing Section, OU=Simple Signing Section 2, CN=*.example.org, CN=*.example.com, C=FR, C=US, L=TOULOUSE, L=LYON, ST=Cheese org state, ST=Cheese com state/emailAddress=cert@example.org/emailAddress=cert@sexample.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:de:77:fa:8d:03:70:30:39:dd:51:1b:cc:60:db:
                    a9:5a:13:b1:af:fe:2c:c6:38:9b:88:0a:0f:8e:d9:
                    1b:a1:1d:af:0d:66:e4:13:5b:bc:5d:36:92:d7:5e:
                    d0:fa:88:29:d3:78:e1:81:de:98:b2:a9:22:3f:bf:
                    8a:af:12:92:63:d4:a9:c3:f2:e4:7e:d2:dc:a2:c5:
                    39:1c:7a:eb:d7:12:70:63:2e:41:47:e0:f0:08:e8:
                    dc:be:09:01:ec:28:09:af:35:d7:79:9c:50:35:d1:
                    6b:e5:87:7b:34:f6:d2:31:65:1d:18:42:69:6c:04:
                    11:83:fe:44:ae:90:92:2d:0b:75:39:57:62:e6:17:
                    2f:47:2b:c7:53:dd:10:2d:c9:e3:06:13:d2:b9:ba:
                    63:2e:3c:7d:83:6b:d6:89:c9:cc:9d:4d:bf:9f:e8:
                    a3:7b:da:c8:99:2b:ba:66:d6:8e:f8:41:41:a0:c9:
                    d0:5e:c8:11:a4:55:4a:93:83:87:63:04:63:41:9c:
                    fb:68:04:67:c2:71:2f:f2:65:1d:02:5d:15:db:2c:
                    d9:04:69:85:c2:7d:0d:ea:3b:ac:85:f8:d4:8f:0f:
                    c5:70:b2:45:e1:ec:b2:54:0b:e9:f7:82:b4:9b:1b:
                    2d:b9:25:d4:ab:ca:8f:5b:44:3e:15:dd:b8:7f:b7:
                    ee:f9
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Subject Key Identifier:
                94:BA:73:78:A2:87:FB:58:28:28:CF:98:3B:C2:45:70:16:6E:29:2F
            X509v3 Authority Key Identifier:
                keyid:1E:52:A2:E8:54:D5:37:EB:D5:A8:1D:E4:C2:04:1D:37:E2:F7:70:03

            X509v3 Subject Alternative Name:
                DNS:*.example.org, DNS:*.example.net, DNS:*.example.com, IP Address:10.0.1.0, IP Address:10.0.1.2, email:test@example.org, email:test@example.net
    Signature Algorithm: sha1WithRSAEncryption
         76:6b:05:b0:0e:34:11:b1:83:99:91:dc:ae:1b:e2:08:15:8b:
         16:b2:9b:27:1c:02:ac:b5:df:1b:d0:d0:75:a4:2b:2c:5c:65:
         ed:99:ab:f7:cd:fe:38:3f:c3:9a:22:31:1b:ac:8c:1c:c2:f9:
         5d:d4:75:7a:2e:72:c7:85:a9:04:af:9f:2a:cc:d3:96:75:f0:
         8e:c7:c6:76:48:ac:45:a4:b9:02:1e:2f:c0:15:c4:07:08:92:
         cb:27:50:67:a1:c8:05:c5:3a:b3:a6:48:be:eb:d5:59:ab:a2:
         1b:95:30:71:13:5b:0a:9a:73:3b:60:cc:10:d0:6a:c7:e5:d7:
         8b:2f:f9:2e:98:f2:ff:81:14:24:09:e3:4b:55:57:09:1a:22:
         74:f1:f6:40:13:31:43:89:71:0a:96:1a:05:82:1f:83:3a:87:
         9b:17:25:ef:5a:55:f2:2d:cd:0d:4d:e4:81:58:b6:e3:8d:09:
         62:9a:0c:bd:e4:e5:5c:f0:95:da:cb:c7:34:2c:34:5f:6d:fc:
         60:7b:12:5b:86:fd:df:21:89:3b:48:08:30:bf:67:ff:8c:e6:
         9b:53:cc:87:36:47:70:40:3b:d9:90:2a:d2:d2:82:c6:9c:f5:
         d1:d8:e0:e6:fd:aa:2f:95:7e:39:ac:fc:4e:d4:ce:65:b3:ec:
         c6:98:8a:31
-----BEGIN CERTIFICATE-----
MIIGWjCCBUKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCCAYQxEzARBgoJkiaJk/Is
ZAEZFgNvcmcxFjAUBgoJkiaJk/IsZAEZFgZjaGVlc2UxDzANBgNVBAoMBkNoZWVz
ZTERMA8GA1UECgwIQ2hlZXNlIDIxHzAdBgNVBAsMFlNpbXBsZSBTaWduaW5nIFNl
Y3Rpb24xITAfBgNVBAsMGFNpbXBsZSBTaWduaW5nIFNlY3Rpb24gMjEaMBgGA1UE
AwwRU2ltcGxlIFNpZ25pbmcgQ0ExHDAaBgNVBAMME1NpbXBsZSBTaWduaW5nIENB
IDIxCzAJBgNVBAYTAkZSMQswCQYDVQQGEwJVUzERMA8GA1UEBwwIVE9VTE9VU0Ux
DTALBgNVBAcMBExZT04xFjAUBgNVBAgMDVNpZ25pbmcgU3RhdGUxGDAWBgNVBAgM
D1NpZ25pbmcgU3RhdGUgMjEhMB8GCSqGSIb3DQEJARYSc2ltcGxlQHNpZ25pbmcu
Y29tMSIwIAYJKoZIhvcNAQkBFhNzaW1wbGUyQHNpZ25pbmcuY29tMB4XDTE4MTIw
NjExMTAxNloXDTIwMTIwNTExMTAxNlowggF2MRMwEQYKCZImiZPyLGQBGRYDb3Jn
MRYwFAYKCZImiZPyLGQBGRYGY2hlZXNlMQ8wDQYDVQQKDAZDaGVlc2UxETAPBgNV
BAoMCENoZWVzZSAyMR8wHQYDVQQLDBZTaW1wbGUgU2lnbmluZyBTZWN0aW9uMSEw
HwYDVQQLDBhTaW1wbGUgU2lnbmluZyBTZWN0aW9uIDIxFTATBgNVBAMMDCouY2hl
ZXNlLm9yZzEVMBMGA1UEAwwMKi5jaGVlc2UuY29tMQswCQYDVQQGEwJGUjELMAkG
A1UEBhMCVVMxETAPBgNVBAcMCFRPVUxPVVNFMQ0wCwYDVQQHDARMWU9OMRkwFwYD
VQQIDBBDaGVlc2Ugb3JnIHN0YXRlMRkwFwYDVQQIDBBDaGVlc2UgY29tIHN0YXRl
MR4wHAYJKoZIhvcNAQkBFg9jZXJ0QGNoZWVzZS5vcmcxHzAdBgkqhkiG9w0BCQEW
EGNlcnRAc2NoZWVzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDed/qNA3AwOd1RG8xg26laE7Gv/izGOJuICg O2RuhHa8NZuQTW7xdNpLXXtD6
iCnTeOGB3piyqSI/v4qvEpJj1KnD8uR 0tyixTkceuvXEnBjLkFH4PAI6Ny CQHs
KAmvNdd5nFA10Wvlh3s09tIxZR0YQmlsBBGD/kSukJItC3U5V2LmFy9HK8dT3RAt
yeMGE9K5umMuPH2Da9aJycydTb f6KN72siZK7pm1o74QUGgydBeyBGkVUqTg4dj
BGNBnPtoBGfCcS/yZR0CXRXbLNkEaYXCfQ3qO6yF NSPD8VwskXh7LJUC n3grSb
Gy25JdSryo9bRD4V3bh/t 75AgMBAAGjgeAwgd0wDgYDVR0PAQH/BAQDAgWgMAkG
A1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQW
BBSUunN4oof7WCgoz5g7wkVwFm4pLzAfBgNVHSMEGDAWgBQeUqLoVNU369WoHeTC
BB034vdwAzBhBgNVHREEWjBYggwqLmNoZWVzZS5vcmeCDCouY2hlZXNlLm5ldIIM
Ki5jaGVlc2UuY29thwQKAAEAhwQKAAECgQ90ZXN0QGNoZWVzZS5vcmeBD3Rlc3RA
Y2hlZXNlLm5ldDANBgkqhkiG9w0BAQUFAAOCAQEAdmsFsA40EbGDmZHcrhviCBWL
FrKbJxwCrLXfG9DQdaQrLFxl7Zmr983 OD/DmiIxG6yMHML5XdR1ei5yx4WpBK f
KszTlnXwjsfGdkisRaS5Ah4vwBXEBwiSyydQZ6HIBcU6s6ZIvuvVWauiG5UwcRNb
CppzO2DMENBqx XXiy/5Lpjy/4EUJAnjS1VXCRoidPH2QBMxQ4lxCpYaBYIfgzqH
mxcl71pV8i3NDU3kgVi2440JYpoMveTlXPCV2svHNCw0X238YHsSW4b93yGJO0gI
ML9n/4zmm1PMhzZHcEA72ZAq0tKCxpz10djg5v2qL5V Oaz8TtTOZbPsxpiKMQ==
-----END CERTIFICATE-----
5.2.2 pem

pem选项将转义的证书设置为X-Forwarded-Tls-Client-Cert头 在这个例子中,它是-----BEGIN CERTIFICATE----- 和-----END CERTIFICATE----- 分界线之间的部分:

代码语言:javascript复制
-----BEGIN CERTIFICATE-----
MIIGWjCCBUKgAwIBAgIBATANBgkqhkiG9w0BAQUFADCCAYQxEzARBgoJkiaJk/Is
ZAEZFgNvcmcxFjAUBgoJkiaJk/IsZAEZFgZjaGVlc2UxDzANBgNVBAoMBkNoZWVz
ZTERMA8GA1UECgwIQ2hlZXNlIDIxHzAdBgNVBAsMFlNpbXBsZSBTaWduaW5nIFNl
Y3Rpb24xITAfBgNVBAsMGFNpbXBsZSBTaWduaW5nIFNlY3Rpb24gMjEaMBgGA1UE
AwwRU2ltcGxlIFNpZ25pbmcgQ0ExHDAaBgNVBAMME1NpbXBsZSBTaWduaW5nIENB
IDIxCzAJBgNVBAYTAkZSMQswCQYDVQQGEwJVUzERMA8GA1UEBwwIVE9VTE9VU0Ux
DTALBgNVBAcMBExZT04xFjAUBgNVBAgMDVNpZ25pbmcgU3RhdGUxGDAWBgNVBAgM
D1NpZ25pbmcgU3RhdGUgMjEhMB8GCSqGSIb3DQEJARYSc2ltcGxlQHNpZ25pbmcu
Y29tMSIwIAYJKoZIhvcNAQkBFhNzaW1wbGUyQHNpZ25pbmcuY29tMB4XDTE4MTIw
NjExMTAxNloXDTIwMTIwNTExMTAxNlowggF2MRMwEQYKCZImiZPyLGQBGRYDb3Jn
MRYwFAYKCZImiZPyLGQBGRYGY2hlZXNlMQ8wDQYDVQQKDAZDaGVlc2UxETAPBgNV
BAoMCENoZWVzZSAyMR8wHQYDVQQLDBZTaW1wbGUgU2lnbmluZyBTZWN0aW9uMSEw
HwYDVQQLDBhTaW1wbGUgU2lnbmluZyBTZWN0aW9uIDIxFTATBgNVBAMMDCouY2hl
ZXNlLm9yZzEVMBMGA1UEAwwMKi5jaGVlc2UuY29tMQswCQYDVQQGEwJGUjELMAkG
A1UEBhMCVVMxETAPBgNVBAcMCFRPVUxPVVNFMQ0wCwYDVQQHDARMWU9OMRkwFwYD
VQQIDBBDaGVlc2Ugb3JnIHN0YXRlMRkwFwYDVQQIDBBDaGVlc2UgY29tIHN0YXRl
MR4wHAYJKoZIhvcNAQkBFg9jZXJ0QGNoZWVzZS5vcmcxHzAdBgkqhkiG9w0BCQEW
EGNlcnRAc2NoZWVzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDed/qNA3AwOd1RG8xg26laE7Gv/izGOJuICg O2RuhHa8NZuQTW7xdNpLXXtD6
iCnTeOGB3piyqSI/v4qvEpJj1KnD8uR 0tyixTkceuvXEnBjLkFH4PAI6Ny CQHs
KAmvNdd5nFA10Wvlh3s09tIxZR0YQmlsBBGD/kSukJItC3U5V2LmFy9HK8dT3RAt
yeMGE9K5umMuPH2Da9aJycydTb f6KN72siZK7pm1o74QUGgydBeyBGkVUqTg4dj
BGNBnPtoBGfCcS/yZR0CXRXbLNkEaYXCfQ3qO6yF NSPD8VwskXh7LJUC n3grSb
Gy25JdSryo9bRD4V3bh/t 75AgMBAAGjgeAwgd0wDgYDVR0PAQH/BAQDAgWgMAkG
A1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQW
BBSUunN4oof7WCgoz5g7wkVwFm4pLzAfBgNVHSMEGDAWgBQeUqLoVNU369WoHeTC
BB034vdwAzBhBgNVHREEWjBYggwqLmNoZWVzZS5vcmeCDCouY2hlZXNlLm5ldIIM
Ki5jaGVlc2UuY29thwQKAAEAhwQKAAECgQ90ZXN0QGNoZWVzZS5vcmeBD3Rlc3RA
Y2hlZXNlLm5ldDANBgkqhkiG9w0BAQUFAAOCAQEAdmsFsA40EbGDmZHcrhviCBWL
FrKbJxwCrLXfG9DQdaQrLFxl7Zmr983 OD/DmiIxG6yMHML5XdR1ei5yx4WpBK f
KszTlnXwjsfGdkisRaS5Ah4vwBXEBwiSyydQZ6HIBcU6s6ZIvuvVWauiG5UwcRNb
CppzO2DMENBqx XXiy/5Lpjy/4EUJAnjS1VXCRoidPH2QBMxQ4lxCpYaBYIfgzqH
mxcl71pV8i3NDU3kgVi2440JYpoMveTlXPCV2svHNCw0X238YHsSW4b93yGJO0gI
ML9n/4zmm1PMhzZHcEA72ZAq0tKCxpz10djg5v2qL5V Oaz8TtTOZbPsxpiKMQ==
-----END CERTIFICATE-----

提取数据:分隔符和n将被删除。如果有多个证书,它们之间用一个","分隔 X-Forwarded-Tls-Client-Cert 的值可能超过web服务器头部大小限制:网络服务器的头文件大小限制通常在4kb和8kb之间。如果这变成了一个问题,并且如果重新配置服务器以允许更大的头文件是不可行的,我们可以通过使用下面描述的信息选项,只选择证书中有趣的部分来缓解这个问题。(并将 pem 设置为 false)

5.2.3 info

info选项选择了你想添加到X-Forwarded-Tls-Client-Cert-Info头的特定客户证书细节. 头部的值是所有选定的证书细节的转义连接。但在下文中,除非另有规定,为了便于阅读,所有标头值的例子都是未转义的. 下面的例子显示了这样一个串联,当所有可用的字段被选中时:

代码语言:javascript复制
Subject="DC=org,DC=cheese,C=FR,C=US,ST=Cheese org state,ST=Cheese com state,L=TOULOUSE,L=LYON,O=Cheese,O=Cheese 2,CN=*.example.com";Issuer="DC=org,DC=cheese,C=FR,C=US,ST=Signing State,ST=Signing State 2,L=TOULOUSE,L=LYON,O=Cheese,O=Cheese 2,CN=Simple Signing CA 2";NB="1544094616";NA="1607166616";SAN="*.example.org,*.example.net,*.example.com,test@example.org,test@example.net,10.0.1.0,10.0.1.2"

如果有一个以上的证书,它们之间用","分隔.

info.notAfter

将info.notAfter选项设置为true,以便从Validity部分添加Not After信息. 数据取自以下证书部分:

代码语言:javascript复制
    Validity
        Not After : Dec  5 11:10:16 2020 GMT

它的格式在标题中如下:

代码语言:javascript复制
NA="1607166616"
info.notBefore

info.notBefore选项设置为true,以便从Validity部分添加Not Before信息 数据取自以下证书部分:

代码语言:javascript复制
Validity
    Not Before: Dec  6 11:10:16 2018 GMT

它的格式在标题中如下:

代码语言:javascript复制
NB="1544094616"
info.sans

info.sans 选项设置为 true,以便从Subject Alternative Name部分添加Subject Alternative Name信息 数据取自以下证书部分:

代码语言:javascript复制
X509v3 Subject Alternative Name:
    DNS:*.example.org, DNS:*.example.net, DNS:*.example.com, IP Address:10.0.1.0, IP Address:10.0.1.2, email:test@example.org, email:test@example.net

它的格式在标题中如下:

代码语言:javascript复制
SAN="*.example.org,*.example.net,*.example.com,test@example.org,test@example.net,10.0.1.0,10.0.1.2"

多个值:SAN被","隔开

info.subject

info.subject选择你想添加到X-Forwarded-Tls-Client-Cert-Info头中的特定客户证书主题细节 数据取自以下证书部分:

代码语言:javascript复制
Subject: DC=org, DC=cheese, O=Cheese, O=Cheese 2, OU=Simple Signing Section, OU=Simple Signing Section 2, CN=*.example.org, CN=*.example.com, C=FR, C=US, L=TOULOUSE, L=LYON, ST=Cheese org state, ST=Cheese com state/emailAddress=cert@example.org/emailAddress=cert@sexample.com
INFO.SUBJECT.COUNTRY

info.subject.country选项设置为true,以将国家信息添加到主题中. 这些数据是用C键从主题部分提取的. 并且在标题中的格式如下:

代码语言:javascript复制
C=FR,C=US
INFO.SUBJECT.PROVINCE

将info.subject.province选项设置为true,以将省份信息添加到主题中. 这些数据是用ST键从主题部分提取的. 并且在标题中的格式如下:

代码语言:javascript复制
ST=Cheese org state,ST=Cheese com state
INFO.SUBJECT.LOCALITY

info.subject.locality选项设置为 true,以将位置信息添加到主题中. 这些数据是从带有L键的主题部分中提取的. 并且在标题中的格式如下:

代码语言:javascript复制
L=TOULOUSE,L=LYON
INFO.SUBJECT.ORGANIZATION

info.subject.organization选项设置为true,以将组织信息添加到主题中. 这些数据是从带有O键的主题部分提取的. 并且在标题中的格式如下:

代码语言:javascript复制
O=Cheese,O=Cheese 2
INFO.SUBJECT.ORGANIZATIONALUNIT

info.subject.organizationalUnit选项设置为true,以将organizationalUnit信息添加到主题中. 这些数据来自带有OU键的主题部分. 并且在标题中的格式如下:

代码语言:javascript复制
OU=Cheese Section,OU=Cheese Section 2
INFO.SUBJECT.COMMONNAME

info.subject.commonName选项设置为true以将commonName信息添加到主题中. 这些数据是从带有CN键的主题部分中提取的. 并且在标题中的格式如下:

代码语言:javascript复制
CN=*.example.com
INFO.SUBJECT.SERIALNUMBER

info.subject.serialNumber选项设置为true以将serialNumber信息添加到主题中. 该数据从带有SN键的主题部分提取. 并且在标题中的格式如下:

代码语言:javascript复制
SN=1234567890
INFO.SUBJECT.DOMAINCOMPONENT

info.subject.domainComponent选项设置为true以将domainComponent信息添加到主题中. 这些数据是从带有DC键的主题部分中提取的. 并且在标题中的格式如下:

代码语言:javascript复制
DC=org,DC=cheese
info.issuer

info.issuer选择了你想添加到X-Forwarded-Tls-Client-Cert-Info头中的特定客户证书签发者细节. 这些数据取自以下证书部分:

代码语言:javascript复制
Issuer: DC=org, DC=cheese, O=Cheese, O=Cheese 2, OU=Simple Signing Section, OU=Simple Signing Section 2, CN=Simple Signing CA, CN=Simple Signing CA 2, C=FR, C=US, L=TOULOUSE, L=LYON, ST=Signing State, ST=Signing State 2/emailAddress=simple@signing.com/emailAddress=simple2@signing.com
INFO.ISSUER.COUNTRY

info.issuer.country选项设置为true,将国家信息添加到发行人中. 这些数据是用C键从签发人部分提取的. 而它在标题中的格式如下:

代码语言:javascript复制
C=FR,C=US
INFO.ISSUER.PROVINCE

info.issuer.province选项设置为true,以将省份信息添加到发行人中. 这些数据是从带有ST键的签发人部分提取的. 而它在标题中的格式如下:

代码语言:javascript复制
ST=Signing State,ST=Signing State 2
INFO.ISSUER.LOCALITY

info.issuer.locality选项设置为 true,以将位置信息添加到签发人中. 该数据从带有L键的签发人部分提取. 而它在标题中的格式如下:

代码语言:javascript复制
L=TOULOUSE,L=LYON
INFO.ISSUER.ORGANIZATION

info.issuer.organization选项设置为true,将组织信息添加到发行人中. 这些数据是从带有O键的签发人部分提取的. 而它在标题中的格式如下:

代码语言:javascript复制
O=Cheese,O=Cheese 2
INFO.ISSUER.COMMONNAME

info.issuer.commonName选项设置为true,将commonName信息添加到签发人中. 该数据取自带有CN密钥的签发人部分. 而它在标题中的格式如下:

代码语言:javascript复制
CN=Simple Signing CA 2
INFO.ISSUER.SERIALNUMBER

info.issuer.serialNumber选项设置为true,将serialNumber信息添加到签发人中. 该数据从带有SN密钥的发行者部分提取. 而它在标题中的格式如下:

代码语言:javascript复制
SN=1234567890
INFO.ISSUER.DOMAINCOMPONENT

info.issuer.domainComponent选项设置为true,将domainComponent信息添加到签发人中. 这些数据是从带有DC密钥的发行者部分提取的. 而它在标题中的格式如下:

代码语言:javascript复制
DC=org,DC=cheese

6.RateLimit

控制进入一个服务的请求的数量,RateLimit中间件确保服务将收到公平数量的请求,并允许人们定义什么是公平.

6.1配置示例

代码语言:javascript复制
# 这里,允许每秒平均100个请求.
# 此外,允许有50个请求的突发.
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    average: 100
    burst: 50

6.2配置选项

6.2.1 average

average(平均速率)是指允许来自特定来源的最大速率,默认为每秒请求数。它的默认值是0,这意味着没有速率限制。 速率实际上是由average(平均数)除以period(周期)来定义的。因此,对于一个低于1 req/s的速率,需要定义一个大于一秒钟的period(周期)

代码语言:javascript复制
# 100 reqs/s
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    average: 100
6.2.2 period

period(周期),与average(平均数)相结合,定义了实际的最高费率,如: 它的默认值是1秒.

代码语言:javascript复制
r = average / period
代码语言:javascript复制
# 6 reqs/minute
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    period: 1m
    average: 6
6.2.3 burst

burst是允许在同一任意小的时间段内通过的最大请求数.它的默认值是1.

代码语言:javascript复制
# 允许有100个请求的突发.
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    burst: 100
6.2.4 sourceCriterion

sourceCriterion选项定义了使用什么标准来将请求归类为来自一个共同的来源。如果同时定义了几个策略,将产生一个错误。如果没有设置,默认是使用请求的远程地址字段(作为ipStrategy).

sourceCriterion.ipStrategy

ipStrategy选项定义了两个参数,用于配置Traefik如何确定客户的IP:depthexcludedIPs.

IPSTRATEGY.DEPTH

depth选项告诉Traefik使用X-Forwarded-For报头并获取位于depth位置的IP(从右侧开始).

  • 如果深度大于X-Forwarded-For中的IP总数,则客户端IP为空
  • 如果深度的值小于或等于0,则忽略深度

depth和X-Forwarded-For的例子:如果深度设置为2,请求X-Forwarded-For的头部是“10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1”,那么真正的客户端IP是“10.0.0.1”(深度4),但是用于白名单的IP是“12.0.0.1”(深度2)

X-FORWARDED-FOR

DEPTH

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

1

"13.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

3

"11.0.0.1"

"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1"

5

""

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    sourceCriterion:
      ipStrategy:
        depth: 2
IPSTRATEGY.EXCLUDEDIPS

提示:

  • 与名称所暗示的相反,这个选项并不是要把一个IP从速率限制器中排除,因此不能用来停用某些IP的速率限制.
  • 如果指定了depth,则忽略excludedip.

excludedIPs是为了解决两类有点不同的使用情况:

  1. 区分在同一个(一组)反向代理后面的IP,以便它们中的每一个都独立于其他的,为自己的限速"bucket"做出贡献(参考 漏桶的比喻)。在这种情况下,excludedIPs应该被设置为与要被排除的X-Forwarded-For IPs列表相匹配,以便找到实际的客户IP.

每个IP作为一个不同的来源:

X-FORWARDED-FOR

EXCLUDEDIPS

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1"

"11.0.0.1,12.0.0.1"

"10.0.0.1"

"10.0.0.2,11.0.0.1,12.0.0.1"

"11.0.0.1,12.0.0.1"

"10.0.0.2"

  1. 将一组IP(也在一组共同的反向代理后面)组合在一起,使它们被认为是同一来源,并且都对同一速率限制桶作出贡献.

将同一源ip组合在一起:

X-FORWARDED-FOR

EXCLUDEDIPS

CLIENTIP

"10.0.0.1,11.0.0.1,12.0.0.1"

"12.0.0.1"

"11.0.0.1"

"10.0.0.2,11.0.0.1,12.0.0.1"

"12.0.0.1"

"11.0.0.1"

"10.0.0.3,11.0.0.1,12.0.0.1"

"12.0.0.1"

"11.0.0.1"

为了完整起见,下面是一些额外的例子来说明匹配是如何进行的。对于一个给定的请求,X-Forwarded-For IPs的列表被从最近到最远的排除IPs池检查,并且返回第一个不在池中的IP(如果有的话)。 客户端IP的匹配:

X-FORWARDED-FOR

EXCLUDEDIPS

CLIENTIP

"10.0.0.1,11.0.0.1,13.0.0.1"

"11.0.0.1"

"13.0.0.1"

"10.0.0.1,11.0.0.1,13.0.0.1"

"15.0.0.1,16.0.0.1"

"13.0.0.1"

"10.0.0.1,11.0.0.1"

"10.0.0.1,11.0.0.1"

""

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    sourceCriterion:
      ipStrategy:
        excludedIPs:
        - 127.0.0.1/32
        - 192.168.1.7

#####

sourceCriterion.requestHeaderName

用于对传入请求进行分组的报头的名称

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    sourceCriterion:
      requestHeaderName: username
sourceCriterion.requestHost

是否将请求主机视为源

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-ratelimit
spec:
  rateLimit:
    sourceCriterion:
      requestHost: true

7.RedirectRegex

将客户端重定向到不同的位置,RedirectRegex使用重码匹配和替换来重定向一个请求.

7.1配置示例

代码语言:javascript复制
# 用域名替换重定向
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-redirectregex
spec:
  redirectRegex:
    regex: ^http://localhost/(.*)
    replacement: http://mydomain/${1}

7.2配置选项

7.2.1 permanent

permanent选项设为 true 以应用永久重定向

7.2.2 regex

regex选项是正则表达式,用于匹配和捕获请求URL中的元素。 提示:

  • 正则表达式和替换可以使用在线工具,如Go Playground或Regex101进行测试
  • 在YAML中定义正则表达式时,任何转义字符都需要转义两次: example.com需要写成 example.com
7.2.3 replacement

替换选项定义了如何修改URL以拥有新的目标URL 注意:在定义替换扩展变量时应注意:1x相当于${1x},而不是${1}x(参见 Regexp.Expand),因此应使用${1}语法

8.RedirectScheme

将客户端重定向到一个不同的Scheme/Port RedirectScheme将请求从一个scheme/port重定向到另一个

8.1 配置示例

代码语言:javascript复制
# Redirect to https
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-redirectscheme
spec:
  redirectScheme:
    scheme: https
    permanent: true

8.2配置选项

8.2.1 permanent

将permanent选项设置为true以应用永久重定向

代码语言:javascript复制
# Redirect to https
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-redirectscheme
spec:
  redirectScheme:
    # ...
    permanent: true
8.2.2 scheme

scheme选项定义了新URL的模式

代码语言:javascript复制
# Redirect to https
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-redirectscheme
spec:
  redirectScheme:
    scheme: https
8.2.3 port

port选项定义新URL的端口

代码语言:javascript复制
# Redirect to https
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-redirectscheme
spec:
  redirectScheme:
    # ...
    port: "443" # 此配置中的Port是字符串,而不是数值

9.ReplacePath

在转发请求前更新路径,替换请求URL的路径

9.1 配置示例

代码语言:javascript复制
# 用/foo替换路径
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-replacepath
spec:
  replacePath:
    path: /foo

9.2 配置选项

9.2.1常规

ReplacePath中间件:

  • 用指定的路径替换实际路径
  • 在X-Replaced-Path头中存储原始路径
9.2.2 path

path选项定义了在请求URL中作为替换的路径

10.ReplacePathRegex

在转发请求前更新路径(使用Regex),ReplaceRegex使用regex匹配和替换来替换一个URL的路径。

10.1 配置示例

代码语言:javascript复制
# 用regex替换路径
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-replacepathregex
spec:
  replacePathRegex:
    regex: ^/foo/(.*)
    replacement: /bar/$1

10.2 配置选项

10.2.1 常规

ReplacePathRegex中间件:

  • 用指定的路径替换实际路径
  • 在X-Replaced-Path头中存储原始路径

提示:

  • 正则表达式和替换可以使用在线工具,如Go Playground或Regex101进行测试
  • 在YAML中定义正则表达式时,任何转义字符都需要转义两次: example.com需要写成 example.com
10.2.2 regex

regex选项是正则表达式,用于匹配和捕获请求URL中的路径

10.2.3 replacement

替换选项定义了替换路径格式,其中可以包括捕获的变量。 注意:在定义替换扩展变量时应注意:1x相当于${1x},而不是${1}x(参见 Regexp.Expand),因此应使用${1}语法

11.Retry

重试直到成功,如果一个后端服务器没有回复,Retry中间件会向该服务器重新发出一定次数的请求。一旦服务器回复,中间件就会停止重试,不管响应状态如何。Retry中间件有一个可选的配置,以启用指数后退。

11.1 配置示例

代码语言:javascript复制
# 用指数退避法重试4次
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-retry
spec:
  retry:
    attempts: 4
    initialInterval: 100ms

11.2 配置选项

11.2.1 attempts

强制性的,attempts选项定义了请求应该被重试的次数。

11.2.2 initialInterval

initialInterval选项定义了指数退避系列中的第一个等待时间。最大的间隔时间被计算为initialInterval的两倍。如果没有指定,请求将被立即重试。 initialInterval的值应以秒为单位,或以有效的持续时间格式提供,见time.ParseDuration.

12.StripPrefix

在转发请求前从路径中删除前缀,从URL路径中删除指定的前缀。

12.1 配置示例

代码语言:javascript复制
# 剥去前缀 /foobar 和 /fiibar
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-stripprefix
spec:
  stripPrefix:
    prefixes:
      - /foobar
      - /fiibar

12.2 配置选项

12.2.1 常规

StripPrefix中间件剥离匹配的路径前缀并将其存储在X-Forwarded-Prefix头中。 提醒:如果你的后端在根路径(/)上监听,但应该在一个特定的前缀上暴露,请使用StripPrefix中间件.

12.2.2 prefixes

前缀选项定义了要从请求URL中剥离的前缀. 例如,/products也匹配/products/shoes/products/shirts. 如果你的后端正在提供资产(例如,图像或JavaScript文件),它可以使用X-Forwarded-Prefix头来正确构建相对的URL。使用前面的例子,后端应该返回/products/shoes/image.png(而不是/images.png,Traefik可能无法将其与同一后端联系起来)

12.2.3 forceSlash

_可选, Default=true_ forceSlash选项确保产生的剥离路径不是空字符串,必要时用/替换。添加这个选项是为了保持这个中间件最初的(非直观的)行为,以避免引入一个破坏性的变化。 建议明确将forceSlash设置为false行为举例:

  • forceSlash=true

PATH

PREFIX TO STRIP

RESULT

/

/

/

/foo

/foo

/

/foo/

/foo

/

/foo/

/foo/

/

/bar

/foo

/bar

/foo/bar

/foo

/bar

  • forceSlash=false

PATH

PREFIX TO STRIP

RESULT

/

/

空的

/foo

/foo

空的

/foo/

/foo

/

/foo/

/foo/

空的

/bar

/foo

/bar

/foo/bar

/foo

/bar

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: example
spec:
  stripPrefix:
    prefixes:
      - "/foobar"
    forceSlash: false

13.StripPrefixRegex

在转发请求前从路径中移除前缀(使用Regex),从URL路径中删除匹配的前缀。

13.1 配置示例

代码语言:javascript复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-stripprefixregex
spec:
  stripPrefixRegex:
    regex:
      - "/foo/[a-z0-9] /[0-9] /"

13.2 配置选项

13.2.1 常规

StripPrefixRegex中间件剥离匹配的路径前缀并将其存储在X-Forwarded-Prefix头中。 提醒:如果您的后端在root路径(/)上聆听,但应在特定的前缀上曝光,请使用StrippreFixRegex中间件.

13.2.2 regex

regex选项是正则表达式,用于匹配请求URL的路径前缀。例如,/products也匹配/products/shoes/products/shirts。如果你的后端正在提供资产(例如,图像或JavaScript文件),它可以使用X-Forwarded-Prefix头来正确构建相对的URL。使用前面的例子,后端应该返回/products/shoes/image.png(而不是/images.png,Traefik可能无法将其与同一后端联系起来)。

提示:

  • 正则表达式和替换可以使用在线工具,如Go Playground或Regex101进行测试。
  • 在YAML中定义正则表达式时,任何转义字符都需要转义两次: example.com需要写成 example.com。

0 人点赞