Running in Minikube, I have the following ingress, with the necessary backend:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /config/
backend:
serviceName: api-gateway
servicePort: webThe intention is to serve the gateway's web UI, which expects the path to be /, otherwise it assumes the it is a logical path and attempts to forward the request to the correct microservice.
The rewrite of the path is not working as I expect it. It doesn't replace /config/ with /. Am I misunderstanding the example?
In the logs of the nginx controller I see:
192.168.99.1 - [192.168.99.1] - - [13/Dec/2017:08:54:11 +0000] "GET /config HTTP/1.1" 301 185 "-" "curl/7.55.1" 78 0.000 [-] - - - -
192.168.99.1 - [192.168.99.1] - - [13/Dec/2017:08:54:11 +0000] "GET /config/ HTTP/1.1" 404 154 "-" "curl/7.55.1" 79 0.010 [dev-api-gateway-web] 172.17.0.10:8080 143 0.010 404That's telling me that a request for /config got rewritten to /config/ and resulted in a 404.
How do I rewrite /config to /?
You are misunderstanding the example. With your configuration requests to the rewrite target / will be rewritten to /config/, not the other way around. So you need to switch paths: use /config as rewrite target, and set the / path in the rule.
So the rewrite target is always where the external requests go to, the rule path where the requests to the service/pod go to.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /config/(.+)
backend:
serviceName: api-gateway
servicePort: web