基於 Traefik 如何實現 path 末尾自動加斜槓?

東風微鳴發表於2022-12-27

前言

Traefik 是一個現代的 HTTP 反向代理和負載均衡器,使部署微服務變得容易。

Traefik 可以與現有的多種基礎設施元件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)整合,並自動和動態地配置自己。

系列文章:

實踐中,一個很常見的需求,使用者輸入的 url 是 ewhisper.cn/alert-manager, 如果什麼都不做會返回 404, 需要自動加斜槓變成 ewhisper.cn/alert-manager/, 如何基於 Traefik on K8S 實現?

答案是:用 redirectRegex MiddleWare + 正則。

實戰

直接建立如下的 MiddleWare:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: auto-add-slash
spec:
  redirectRegex:
    permanent: true
    regex: ^(https?://[^/]+/[-a-z0-9_]+)$
    replacement: ${1}/

?說明如下:

正則匹配的內容為:

  • ^(https?: 以 https 或 http 開頭的內容;? 表示匹配前一個字元 0 或 1
  • [^/]+/: 匹配 URL 第一個 / 之前的內容
  • [-a-z0-9_]+: 匹配第一個 / 之後的內容,往往為字母數字和中劃線及下劃線

最終,^(https?://[^/]+/[-a-z0-9_]+)$ 該 group 匹配的內容示例如:https://ewhisper.cn/monitor-alertmanager, 並將其替換為:${1}/, 即將匹配的 group 後面加上 /, 示例如:https://ewhisper.cn/monitor-alertmanager

? 注意:

上面的 MiddleWare 可能無法適應所有的情況, 讀者可以領會其要點, 並根據自己的需求做適當調整.

IngressRoute 使用

直接這樣使用:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: alertmanager
spec:
  routes:
    - kind: Rule
      match: Host(`ewhisper.cn`) && PathPrefix(`/alertmanager`)
      middlewares:
        - name: auto-add-slash
      services:
        - name: alertmanager
          port: 9093

??? 完成!

EOF

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章