Kubernetes Nginx Ingress 删除了 URL 的一部分
Kubernetes Nginx Ingress removing part of URL
我正在 Kubernetes(在 AKS 上)部署一个简单的应用程序,它位于使用 Nginx 的 Ingress 后面,使用 Nginx helm chart 部署。我有一个问题,由于某种原因,Nginx 似乎没有将完整的 URL 传递给后端服务。
例如,我的 Ingress 设置了 http://app.client.com and a path of /app1g going http://app.client.com/app1 works fine. However if I try to go to http://app.client.com/app1/service1 I just end up at http://app.client.com/app1 的 URL,它似乎正在剥离路径后的所有内容。
我的 Ingress 是这样的:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
creationTimestamp: "2019-04-03T12:44:22Z"
generation: 1
labels:
chart: app-1.1
component: app
hostName: app.client.com
release: app
name: app-ingress
namespace: default
resourceVersion: "1789269"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/app-ingress
uid: 34bb1a1d-560e-11e9-bd46-9a03420914b9
spec:
rules:
- host: app.client.com
http:
paths:
- backend:
serviceName: app-service
servicePort: 8080
path: /app1
tls:
- hosts:
- app.client.com
secretName: app-prod
status:
loadBalancer:
ingress:
- {}
如果我转发到服务并直接点击它就可以了。
删除此行应该可以解决您的问题:
nginx.ingress.kubernetes.io/rewrite-target: /
重写目标注释将完全按照它所说的进行操作:重写您的请求以命中“/”位置。参见 nginx-ingress docs for rewrite target。
所以我找到了这个问题的答案。从 Nginx v0.22.0 开始,您似乎需要使用捕获组来捕获请求 URI 中的任何子字符串。在 0.22.0 之前,仅使用 nginx.ingress.kubernetes.io/rewrite-target: /
对任何子字符串都有效。现在它没有。我需要修改我的入口才能使用它:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
creationTimestamp: "2019-04-03T12:44:22Z"
generation: 1
labels:
chart: app-1.1
component: app
hostName: app.client.com
release: app
name: app-ingress
namespace: default
resourceVersion: "1789269"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/app-ingress
uid: 34bb1a1d-560e-11e9-bd46-9a03420914b9
spec:
rules:
- host: app.client.com
http:
paths:
- backend:
serviceName: app-service
servicePort: 8080
path: /app1/?(.*)
tls:
- hosts:
- app.client.com
secretName: app-prod
status:
loadBalancer:
ingress:
- {}
我正在 Kubernetes(在 AKS 上)部署一个简单的应用程序,它位于使用 Nginx 的 Ingress 后面,使用 Nginx helm chart 部署。我有一个问题,由于某种原因,Nginx 似乎没有将完整的 URL 传递给后端服务。
例如,我的 Ingress 设置了 http://app.client.com and a path of /app1g going http://app.client.com/app1 works fine. However if I try to go to http://app.client.com/app1/service1 I just end up at http://app.client.com/app1 的 URL,它似乎正在剥离路径后的所有内容。
我的 Ingress 是这样的:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
creationTimestamp: "2019-04-03T12:44:22Z"
generation: 1
labels:
chart: app-1.1
component: app
hostName: app.client.com
release: app
name: app-ingress
namespace: default
resourceVersion: "1789269"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/app-ingress
uid: 34bb1a1d-560e-11e9-bd46-9a03420914b9
spec:
rules:
- host: app.client.com
http:
paths:
- backend:
serviceName: app-service
servicePort: 8080
path: /app1
tls:
- hosts:
- app.client.com
secretName: app-prod
status:
loadBalancer:
ingress:
- {}
如果我转发到服务并直接点击它就可以了。
删除此行应该可以解决您的问题:
nginx.ingress.kubernetes.io/rewrite-target: /
重写目标注释将完全按照它所说的进行操作:重写您的请求以命中“/”位置。参见 nginx-ingress docs for rewrite target。
所以我找到了这个问题的答案。从 Nginx v0.22.0 开始,您似乎需要使用捕获组来捕获请求 URI 中的任何子字符串。在 0.22.0 之前,仅使用 nginx.ingress.kubernetes.io/rewrite-target: /
对任何子字符串都有效。现在它没有。我需要修改我的入口才能使用它:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
creationTimestamp: "2019-04-03T12:44:22Z"
generation: 1
labels:
chart: app-1.1
component: app
hostName: app.client.com
release: app
name: app-ingress
namespace: default
resourceVersion: "1789269"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/app-ingress
uid: 34bb1a1d-560e-11e9-bd46-9a03420914b9
spec:
rules:
- host: app.client.com
http:
paths:
- backend:
serviceName: app-service
servicePort: 8080
path: /app1/?(.*)
tls:
- hosts:
- app.client.com
secretName: app-prod
status:
loadBalancer:
ingress:
- {}