Kubernetes ingress nginx not matching sub paths

10/19/2018

I'm trying to make a simple example of ingress-nginx on google cloud, but it's not matching the subpaths:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
        - path: /one
          backend:
            serviceName: test-one-backend
            servicePort: 80
        - path: /two
          backend:
            serviceName: test-two-backend
            servicePort: 80

When I call, http://server/one works, but when I call http://server/one/path I get a 404. I'd tried several things like using regex, but is simply not working

The backends are just, echo servers that reply always on any path.

-- Alex M
kubernetes
kubernetes-ingress
nginx-ingress

3 Answers

10/19/2018

This definition matches the exact string for the path. If you want to include subdirectories you can use the wildcard *. Your modified definition should look like this:

- path: /one/*
  backend:
    serviceName: test-one-backend
    servicePort: 80

I am not sure if http://server/one (without the slash at the end) still works. In that case you have to keep your old definition and add another one like the above.

-- mbuechmann
Source: StackOverflow

10/19/2018

You need to use a /* at the end of the path:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
        - path: /one/*
          backend:
            serviceName: test-one-backend
            servicePort: 80
        - path: /two
          backend:
            serviceName: test-two-backend
            servicePort: 80

It's not really documented widely as of today, but in essence the path translates to a location {} block in the nginx.conf

-- Rico
Source: StackOverflow

6/28/2019

Attention it changed in version 0.22.0 of ingress-nginx. checkout example at https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md Now you have to work with captured groups to pass a subpath to the rewrite-target.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /something(/|$)(.*)
-- Matthias Wiedemann
Source: StackOverflow