nginx ingress sub path redirection nginx ingress sub path redirection kubernetes kubernetes

nginx ingress sub path redirection


Looks like your ingress is not serving anything /devops/*. Try adding another path /devops/* with the same backend. Basically this:

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-ingress namespace: ingress-nginx annotations:   kubernetes.io/ingress.class: nginx   nginx.ingress.kubernetes.io/rewrite-target: /   nginx.ingress.kubernetes.io/add-base-url : "true"spec: rules: - host: master1.dev.local   http:     paths:     - backend:         serviceName: devops1         servicePort: 10311       path: /devops/*     - backend:         serviceName: devops1         servicePort: 10311       path: /devops

Update: the above has been deprecated in favor of something like this:

apiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/rewrite-target: /$2  name: rewrite  namespace: defaultspec:  rules:  - host: master1.dev.local    http:      paths:      - backend:          serviceName: devops1          servicePort: 10311        path: /devops(/|$)(.*)


If you access http://hostname/devops/logs directly from your browser, certainly you will get what you want. But since you click the hyperlink in the homepage, then you can only get http://hostname/logs, which will be certainly failed.

So, you need /logs backend configured in your ingress yaml to get it processed, and configure nginx.ingress.kubernetes.io/configuration-snippet to ensure /logs not get rewrote, like this:

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-ingress namespace: ingress-nginx annotations:   kubernetes.io/ingress.class: nginx   nginx.ingress.kubernetes.io/rewrite-target: /   nginx.ingress.kubernetes.io/add-base-url : "true"   nginx.ingress.kubernetes.io/configuration-snippet: |     rewrite ^/logs /logs break;spec: rules: - host: master1.dev.local   http:     paths:     - backend:         serviceName: devops1         servicePort: 10311       path: /logs     - backend:         serviceName: devops1         servicePort: 10311       path: /devops


The nginx.ingress.kubernetes.io/x-forwarded-prefix annotation can be used for this purpose.

It adds x-forwarded-prefix header to http request with a value from this annotation. You can use it, if your backend support such header.

For example, Spring Boot application can handle it by using property:

server.forward-headers-strategy=framework

In your case ingress would look like the following:

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-ingress namespace: ingress-nginx annotations:   kubernetes.io/ingress.class: nginx   nginx.ingress.kubernetes.io/rewrite-target: /   nginx.ingress.kubernetes.io/x-forwarded-prefix: /devopsspec: rules: - host: master1.dev.local   http:     paths:     - backend:         serviceName: devops1         servicePort: 10311       path: /devops

This solution has its downsides. It forces you to declare each service in separate ingress.