带有 nginx 入口路径重写问题的 Minikube
Minikube with nginx ingress path rewrite issue
我正在使用带有 nginx 入口的 minikube。
我正在尝试使用 url 重写 this
这是我的入口定义:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: config-reader-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
backend:
serviceName: default-http-backend
servicePort: 80
rules:
- host: microservices.info
http:
paths:
- path: /reload(/|$)(.*)
backend:
serviceName: spring-cloud-reload
servicePort: 8080
- path: /upload(/|$)(.*)
backend:
serviceName: spring-cloud-upload
servicePort: 8080
下面的urls改写成这样:
/reload
到 /
/reload/xyx
到 /xyz
很好。但是
/reload/x/y
重写为 /x//
而不是 /x/y
还有
/reload/x/y/
重写为 /x/y//
而不是 /x/y/
minikube version: v0.35.0
如何解决多路径元素的情况?
更新
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.21.0
Build: git-b65b85cd9
Repository: https://github.com/aledbf/ingress-nginx
-------------------------------------------------------------------------------
之前的 nginx-ingress v0.22.0 存在尾部斜杠的已知问题。
要检测哪个版本的入口控制器是 运行ning,执行 pod 和 运行 nginx-ingress-控制器版本命令。
kubectl exec -it $POD_NAME -- /nginx-ingress-controller --version
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.24.1
Build: git-ce418168f
Repository: https://github.com/kubernetes/ingress-nginx
-------------------------------------------------------------------------------
重写目标注释对尾部斜杠非常敏感。如果不存在,则不会重写请求。
因此,您应该始终提供 url 作为 /reload/x/y/
重复尾部斜杠的另一个问题(已在 v 0.22.0 及更高版本中修复)。
为了了解那里发生了什么,您可以执行 ingress-controller pod,找到 /etc/nginx/nginx.conf
并搜索
set $location_path "/reload(/|${literal_dollar})(.*)";
或
rewrite "(?i)/reload(/|$)(.*)" / break;
块
要修复它,请将 ingress-controller 版本更新到最新版本,或者您也可以使用 configuration-snippet 注释:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite (?i)/reload/x/y/ /x/y break;
我正在使用带有 nginx 入口的 minikube。
我正在尝试使用 url 重写 this
这是我的入口定义:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: config-reader-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
backend:
serviceName: default-http-backend
servicePort: 80
rules:
- host: microservices.info
http:
paths:
- path: /reload(/|$)(.*)
backend:
serviceName: spring-cloud-reload
servicePort: 8080
- path: /upload(/|$)(.*)
backend:
serviceName: spring-cloud-upload
servicePort: 8080
下面的urls改写成这样:
/reload
到/
/reload/xyx
到/xyz
很好。但是
/reload/x/y
重写为/x//
而不是/x/y
还有
/reload/x/y/
重写为/x/y//
而不是/x/y/
minikube version: v0.35.0
如何解决多路径元素的情况?
更新
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.21.0
Build: git-b65b85cd9
Repository: https://github.com/aledbf/ingress-nginx
-------------------------------------------------------------------------------
之前的 nginx-ingress v0.22.0 存在尾部斜杠的已知问题。
要检测哪个版本的入口控制器是 运行ning,执行 pod 和 运行 nginx-ingress-控制器版本命令。
kubectl exec -it $POD_NAME -- /nginx-ingress-controller --version
-------------------------------------------------------------------------------
NGINX Ingress controller
Release: 0.24.1
Build: git-ce418168f
Repository: https://github.com/kubernetes/ingress-nginx
-------------------------------------------------------------------------------
重写目标注释对尾部斜杠非常敏感。如果不存在,则不会重写请求。
因此,您应该始终提供 url 作为 /reload/x/y/
重复尾部斜杠的另一个问题(已在 v 0.22.0 及更高版本中修复)。
为了了解那里发生了什么,您可以执行 ingress-controller pod,找到 /etc/nginx/nginx.conf
并搜索
set $location_path "/reload(/|${literal_dollar})(.*)";
或
rewrite "(?i)/reload(/|$)(.*)" / break;
块
要修复它,请将 ingress-controller 版本更新到最新版本,或者您也可以使用 configuration-snippet 注释:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite (?i)/reload/x/y/ /x/y break;