Traefik2.X 版本 中 URL Rewrite 的使用
k8s版本:1.20.12
traefik版本:2.4.8
根据实践操作,部分内容跟原文对比有删改
比如我们现在在 Kubernetes 集群中部署了一个 Nexus 应用,和其他应用一样,我们通过 IngressRoute 来暴露服务,对应的资源清单如下所示:(nexus.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nexus
namespace: test
labels:
app: nexus
spec:
selector:
matchLabels:
app: nexus
template:
metadata:
labels:
app: nexus
spec:
containers:
- image: sonatype/nexus3:3.37.3
imagePullPolicy: IfNotPresent
name: nexus
ports:
- containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nexus
name: nexus
namespace: test
spec:
ports:
- name: nexusport
port: 8081
targetPort: 8081
selector:
app: nexus
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`)
services:
- kind: Service
name: nexus
port: 8081
dashboard面板使用的网址是www.daniel.com,在这里还是用的话访问报错404,因此换一个网址,本机hosts文件里添加解析
执行查看
kubectl apply -f nexus.yaml
kubectl get ingressroute -n test
kubectl get deployment -n test
kubectl get svc -n test
kubectl get pod -n test
部署完成后,我们根据 IngressRoute 对象中的配置,只需要将域名 www.aaa.com 解析到 Traefik 的节点即可访问:

同样的现在我们有一个需求是目前我们只有一个域名可以使用,但是我们有很多不同的应用需要暴露,这个时候我们就只能通过 PATH 路径来进行区分了,比如我们现在希望当我们访问 http:/www.daniel.com/nexus 的时候就是访问的我们的 Nexus 这个应用,当路径是 /foo 开头的时候是其他应用,这种需求是很正常的,这个时候我们就需要来做 URL Rewrite 了。
首先我们使用 StripPrefix这个中间件,这个中间件的功能是在转发请求之前从路径中删除前缀,在使用中间件的时候我们只需要理解中间件操作的都是我们直接的请求即可,并不是真实的应用接收到请求过后来进行修改。

现在我们添加一个如下的中间件:
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: strip-foo-path
namespace: test # 注意中间件所在命名空间
spec:
stripPrefix:
prefixes:
- /nexus
创建中间件
然后现在我们就需要从 http:/www.aaa.com/nexus 请求中去匹配 /nexus 的请求,把这个路径下面的请求应用到上面的中间件中去,因为最终我们的 Nexus 应用接收到的请求是不会带有 /nexus 路径的,所以我们需要在请求到达应用之前将这个前缀删除,更新 IngressRoute 对象:
注意:这一步是修改www.aaa.com的IngressRoute 对象,也就是上一步创建的
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/nexus`)
middlewares:
- name: strip-foo-path
services:
- kind: Service
name: nexus
port: 8081
更新完成上面的 IngressRoute 对象后,这个时候我们前往浏览器中访问 http:/www.aaa.com/nexus,这个时候发现我们的页面任何样式都没有了:

通过 Chrome 浏览器的 Network 可以查看到 /nexus路径的请求是200状态码,但是其他的静态资源对象确全都是404了,这是为什么呢?我们仔细观察上面我们的 IngressRoute 资源对象,我们现在是不是只匹配了 /nexus的请求,而我们的静态资源是 /static 路径开头的,当然就匹配不到了,所以就出现了404,所以我们只需要加上这个 /static 路径的匹配就可以了,同样更新 IngressRoute 对象:
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/nexus`)
middlewares:
- name: strip-foo-path
services:
- kind: Service
name: nexus
port: 8081
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/static`)
services:
- kind: Service
name: nexus
port: 8081
然后更新 IngressRoute 资源对象,这个时候再次去访问应用,可以发现页面样式已经正常了,也可以正常访问应用了,但进入应用后发现还是有错误提示信息,通过 Network 分析发现还有一些 /service 开头的请求是404,当然我们再加上这个前缀的路径即可:

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: nexus
namespace: test
spec:
entryPoints:
- web
routes:
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/nexus`)
middlewares:
- name: strip-foo-path
services:
- kind: Service
name: nexus
port: 8081
- kind: Rule
match: Host(`www.aaa.com`) && PathPrefix(`/static`) || PathPrefix(`/service`)
services:
- kind: Service
name: nexus
port: 8081
更新后,再次访问应用就已经完全正常了

Traefik2.X 版本 中 URL Rewrite 的使用的更多相关文章
- Windows10中的IIS10安装php manager和IIS URL Rewrite 2.0组件的方法
Windows10中自带的Server:Microsoft-IIS/10.0,然后这个10却让原本支持组件无法安装了,php manager组件安装时提示“必须安装IIS7以上才可以安装”.那是不是真 ...
- 在ASP.NET MVC中使用IIS级别的URL Rewrite
原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...
- Windows Server 2016中,安装PHP Manager,ARR3.0或者URL Rewrite 2.0无法成功的解决办法
如图: 无法安装原因都是这几个工具无法识别10.0这个版本,可以修改注册表来先完成安装,然后再改回去 PHPManager的修改方法如下: 打开注册表工具(运行Regedt32),找到:HKEY_LO ...
- resin中关于url rewrite来传递jsessionid的问题
最近两天在项目中碰到,一个很奇怪的问题.同一个账号多次切换登录时,会出现这个账号的信息在session中找不到,虽然可以登录成功,但是之后这个用户信息好像没有保存到session中一样,或者是被改变了 ...
- ASP.NET Core中怎么实现Url rewrite功能
我们可以使用ASP.NET Core的中间件来实现Url rewrite功能,下面我们定义一个中间件ReplaceQueryStringMiddleware来替换Http请求中的Url参数即Query ...
- 在IIS 中如何配置URL Rewrite,并且利用出站规则保持被重写的Cookie的域
Url Rewrite配置 xx.aa.com/bb/test1.aspx 会重写到 bb.aa.com/test1.aspx 具体怎么配置入站 出站规则 结果:
- 翻译:为 URL Rewrite 模块创建重写规则
原文名称:Creating Rewrite Rules for the URL Rewrite Module 原文地址:http://www.iis.net/learn/extensions/url- ...
- IIS URL Rewrite Module防盗链规则配置方法
IIS版本:IIS 7.5 URL Rewrite组件:IIS URL Rewrite Module(http://www.iis.net/downloads/microsoft/url-rewrit ...
- IIS7伪静态化URL Rewrite模块
原文 IIS7伪静态化URL Rewrite模块 在Win7安装了IIS7.5之后,搭建一些网站或者博客,但是IIS7.5本身没有URL Rewrite功能,也就是无法实现网址的伪静态化. 从网上找了 ...
随机推荐
- IDEA的概述和IDEA的安装
开发工具概述 IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量. 它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中 ...
- 从Python到水一篇AI论文(核心 or Sci三区+)
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- ooday04 Java_面向对象_重写_static
方法的重写(override/overriding):重新写.覆盖 发生在父子类中,方法名相同,参数列表相同 重写方法被调用时,看对象的类型------------这是规定,记住就OK 当派生类觉得超 ...
- 算法竞赛进阶指南 0x43 线段树
目录 线段树简介 线段树的简单代码实现 建树代码 修改操作 查询操作 线段树的查询操作的时间复杂度分析: AcWing245. 你能回答这些问题吗 思路 代码[时间复杂度:\(O( \space(N+ ...
- 求广义表深度(严5.30)--------西工大noj
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef enum{ATOM, LIST ...
- 基于gRPC编写golang简单C2远控
概述 构建一个简单的远控木马需要编写三个独立的部分:植入程序.服务端程序和管理程序. 植入程序是运行在目标机器上的远控木马的一部分.植入程序会定期轮询服务器以查找新的命令,然后将命令输出发回给服务器. ...
- 小试牛刀:Linux中部署RabbitMQ
一.下载地址 本人采用的是 RabbitMQ 3.8.20+ Erlang 23.3.4.16 1.Erlang下载:https://github.com/erlang/otp/releases 2. ...
- 利用基于Python的Pelican打造一个自己的个人纯静态网站
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_100 其实呢这么多年以来我一直建议每个有技术追求的开发者都要有写技术博客记笔记的良好习惯,一来可以积累知识,二来可以帮助别人,三来 ...
- Redis 05 集合
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 Set 中的值 ...
- ASP.NET Core依赖注入系统学习教程:容器对构造函数选择的策略
.NET Core的依赖注入容器之所以能够为应用程序提供服务实例,这都归功于ServiceDescriptor对象提供的服务注册信息.另外,在ServiceDescriptor对象中,还为容器准备了3 ...