前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Traefik的小技巧2则:如何实现向后转发自动去掉前缀 & 如何实现 path 末尾自动加斜杠?

基于Traefik的小技巧2则:如何实现向后转发自动去掉前缀 & 如何实现 path 末尾自动加斜杠?

作者头像
东风微鸣
发布2022-12-01 16:09:49
1.3K0
发布2022-12-01 16:09:49
举报
文章被收录于专栏:东风微鸣技术博客

前言

Traefik[1] 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易。

Traefik 可以与现有的多种基础设施组件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)集成,并自动和动态地配置自己。

系列文章:

•《Traefik 系列文章》[2]

向后转发自动去掉前缀

实践中, 往往会有这样的需求, 用户输入的url是https://ewhisper.cn/alert-manager/#/alerts, 但是转发到后端要变成http://alertmanager:9093/#/alerts, 如何基于 Traefik on K8S 实现?

答案是: 使用 StripPrefixRegex MiddleWare.

实战

直接创建如下的一个 MiddleWare:

代码语言:javascript
复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix-1
spec:
  stripPrefixRegex:
    regex:
      - /[^/]+/

以上实现的功能就是去掉一层/<xxx>/ 前缀.

去掉两层前缀

去掉两层前缀也很简单:

代码语言:javascript
复制
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix-2
spec:
  stripPrefixRegex:
    regex:
      - /[^/]+/[^/]+/

IngressRoute 使用

直接这样使用:

代码语言:javascript
复制
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: alertmanager
spec:
  routes:
    - kind: Rule
      match: Host(`ewhisper.cn`) && PathPrefix(`/alertmanager/`)
      middlewares:
        - name: strip-prefix-1
      services:
        - name: alertmanager
          port: 9093

🎉🎉🎉 完成!

Path 末尾自动加斜杠

实践中,一个很常见的需求,用户输入的 url 是 ewhisper.cn/alert-manager, 如果什么都不做会返回 404, 需要自动加斜杠变成 ewhisper.cn/alert-manager/, 如何基于 Traefik on K8S 实现?

答案是:用 redirectRegex MiddleWare + 正则。

实战

直接创建如下的 MiddleWare:

代码语言:javascript
复制
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 使用

直接这样使用:

代码语言:javascript
复制
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

References

[1] Traefik: https://traefik.io/ [2] 《Traefik 系列文章》: https://ewhisper.cn/tags/Traefik/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 向后转发自动去掉前缀
  • 实战
    • 去掉两层前缀
      • IngressRoute 使用
      • Path 末尾自动加斜杠
        • 实战
          • IngressRoute 使用
          • References
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档