Я пытаюсь переписать путь к службе, сохраняя URL-адрес браузера с входом nginx на кубернетах.
Мне нужно вот это:
http://example.com/path
=> http://service
http://example.com/path/bar
=> http://service/bar
http://example.com/path/file.css
=> http://service/file.css
То есть сделать /path
быть корневым (или другим URL-адресом) на вышестоящем сервере.
Из того, что я вижу Вот, это делается с помощью завершающей косой черты на proxy_pass, но вход nginx, похоже, не имеет этой опции.
Возможен ли вход nginx?
Возможно ли это на Nginx Ingress?
Да, для этого вы можете использовать rewrite-target
.
Он создаст группу захвата и отправит ее в соответствующий сервис. Вот пример Ingress:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: "rewrite"
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http: example.com
paths:
- path: /foo(/|$)(.*)
backend:
serviceName: echo-svc
servicePort: 80
В этом определении входа любые символы, захваченные
(.*)
будет назначен заполнителю$2
, который затем используется как параметр вrewrite-target
аннотация.
Этот вход будет делать следующее:
В NGINX регулярные выражения следуют политике первого совпадения. Чтобы обеспечить более точное сопоставление путей, ingress-nginx сначала упорядочивает пути по убыванию длины, прежде чем записывать их в шаблон NGINX в виде блоков местоположения.
Пример:
$ kubectl apply -f echo-ingress.yaml
ingress.networking.k8s.io/echo-ingress created
$ kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
echo-ingress mydomain.com 35.188.7.149 80 48s
$ tail -n 1 /etc/hosts
35.188.7.149 mydomain.com
$ curl mydomain.com/foo/bar
{"path": "/bar",
...suppressed output...
"os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}
$ curl mydomain.com/foo
{"path": "/",
"os": {"hostname": "echo-deploy-764d5df7cf-6m5nz"}
}
Если у вас есть вопросы, дайте мне знать в комментариях.