Search code examples
nginxkuberneteskubernetes-ingressnginx-ingress

Kubernetes Nginx Ingress - Rewrite Dynamic URL


Here i have kubernetes running on minikube and it has 2 services backend and frontend. And i have installed ingress addon for minikube.

I wanted to rewrite whenever the frontend request the path url is /users/{user-id} it goes to backend service with the same url dynamically.

Let say the request is /users it rewrite to backend service to /users, /users/1 it goes to /users/1.

I tried to read nginx manual found some special expression i don't understand.

This is my ingress configuration.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-be
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /users/$1
spec:
  ingressClassName: nginx
  rules:
    - host: backend
      http:
        paths:
          - path: /users/(.*)
            pathType: Prefix
            backend:
              service:
                name: backend
                port:
                  number: 5000

My configuration seems fine when the request is /users/{users-id} but when the request is /users, my ingress won't redirect me to '/users' in backend service.

When i tested with curl, this is the output.

curl http://backend/users/3

{"id":3,"name":"Sofia","email":"[email protected]","gender":"Female","createdAt":"2022-04-05T15:46:46.000Z","updatedAt":"2022-04-05T15:46:46.000Z"}%
curl http://backend/users

<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

What am i missing here?

Thank you in advance for your help!


Solution

  • Update!

    Andreas in the comment suggest me to use /users/ and it works!

    Then i decided to modified my ingress configuration.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-be
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /users/$2
    spec:
      ingressClassName: nginx
      rules:
        - host: backend
          http:
            paths:
              - path: /users(/|$)(.*)
                pathType: Prefix
                backend:
                  service:
                    name: backend
                    port:
                      number: 5000