I'm using minikube with nginx ingress.
I'm trying to use url rewriting like this
Here is my ingress definition:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: config-reader-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
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: 8080The following urls rewrites like this:
/reload to /
/reload/xyx to /xyz
which is fine. But
/reload/x/y rewrites to /x// instead of /x/yalso
/reload/x/y/ rewrites to /x/y// instead of /x/y/minikube version: v0.35.0
How can be fixed the multiple path elements case?
UPDATE
-------------------------------------------------------------------------------
NGINX Ingress controller
  Release:    0.21.0
  Build:      git-b65b85cd9
  Repository: https://github.com/aledbf/ingress-nginx
-------------------------------------------------------------------------------
Prior nginx-ingress v0.22.0 there was a known issue with trailing slashes.
To detect which version of the ingress controller is running, exec into the pod and run nginx-ingress-controller version command.
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
-------------------------------------------------------------------------------
Rewrite target annotation is very sensitive for trailing slashes. If it's not present, the request will not be rewritten.
Thus, you should always supply url as /reload/x/y/
Another problem with duplicated trailing slashes (fixed in v 0.22.0 and higher).
In order to understand, what's is going on there, you can exec to ingress-controller pod, find /etc/nginx/nginx.conf and search for
set $location_path  "/reload(/|${literal_dollar})(.*)";or
rewrite "(?i)/reload(/|$)(.*)" /$2 break;blocks
To fix it, either update ingress-controller version to the latest or you can also use configuration-snippet annotation:
nginx.ingress.kubernetes.io/configuration-snippet: |
    rewrite (?i)/reload/x/y/ /x/y break;