Назад | Перейти на главную страницу

Как переписать URL-адрес на бэкэнд при сохранении URL-адреса браузера в nginx ingress?

Я пытаюсь переписать путь к службе, сохраняя URL-адрес браузера с входом nginx на кубернетах.

Мне нужно вот это:

То есть сделать /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 аннотация.

Этот вход будет делать следующее:

  • Запросы к / foo будет доставлен в echo1-svc как /
  • Запросы к / foo / bar будет доставлен в echo1-svc как /бар
  • Запросы к /foo/file.css будет доставлен в echo-svc как /file.css
  • Nginx Ingress использует Приоритет пути:

В 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"}
}

Если у вас есть вопросы, дайте мне знать в комментариях.