如何使用nginx捕获组附加前缀以重写规则



我目前正在尝试重写 kubernetes 入口中的四条路径。

这三个都已完成,但静态文件路径有点棘手。

我的前端路径是/$1->/(.*)web-front-cluster-ip-service

我还需要重写所有/img/$1->/img/(.*)apollo-api-cluster-ip-service

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: servers-ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- backend:
serviceName: apollo-api-cluster-ip-service
servicePort: 4000
path: /apollo_api/?(.*)
- backend:
serviceName: rest-api-cluster-ip-service
servicePort: 5000
path: /rest/?(.*)
- backend:
serviceName: web-front-cluster-ip-service
servicePort: 6000
path: /?(.*)
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: statics-ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /img/$1
spec:
rules:
- http:
paths:
- backend:
serviceName: apollo-api-cluster-ip-service
servicePort: 4000
path: /img/?$(.*)

我当前的设置如上所示,但由于未知原因,我无法到达第二条路由配置的路由。

所以我要做的是将两条路由组合在一起,并为与/img匹配的捕获组提供前缀

如果我这样做

- backend:
serviceName: apollo-api-cluster-ip-service
servicePort: 6000
path: /?(.*)

当我需要将任何不以/img开头的路由路由到web-front时,它会将所有内容路由到apollo-api

所以我需要下面这样的东西

- backend:
serviceName: apollo-api-cluster-ip-service
servicePort: 4000
path: /img?(.*) <- somehow add /img to $(.*) because currently it rewrites `/img/static.png` -> `/static.png` but I need `/img/static.png` -> `/img/static.png`.

任何帮助将不胜感激。

如重写目标文档中所述:

!!注意 从版本 0.22.0 开始,入口定义使用 批注 nginx.ingress.kubernetes.io/rewrite-target 不是 向后兼容以前的版本。在版本 0.22.0 和 超出请求 URI 中需要传递的任何子字符串 必须在捕获组中显式定义重写的路径。

!!注意 捕获的组按时间顺序以 $1、$2 ... $n 的形式保存在编号占位符中。这些占位符可以是 用作重写目标注释中的参数。

所以我想你的第二个入口应该看起来像:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: statics-ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /img/$2
spec:
rules:
- http:
paths:
- backend:
serviceName: apollo-api-cluster-ip-service
servicePort: 4000
path: /img(/|$)(.*)

在这种情况下,$2将反映(.*)

最新更新