Как использовать группу захвата nginx для присоединения префикса к правилу перезаписи

#nginx #kubernetes #kubernetes-ingress

#nginx #kubernetes #kubernetes-вход

Вопрос:

В настоящее время я пытаюсь переписать четыре пути в kubernetes ingress.

Все три выполнены, но статический путь к файлу немного сложнее.

Мой путь к интерфейсу /$1 -> /(.*) web-front-cluster-ip-service

Мне также нужно переписать all /img/$1 -> /img/(.*) apollo-api-cluster-ip-service

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: servers-ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: apollo-api-cluster-ip-service
              servicePort: 4000
            path: /apollo_api/?(.*)
          - backend:
              serviceName: rest-api-cluster-ip-service
              servicePort: 5000
            path: /rest/?(.*)
          - backend:
              serviceName: web-front-cluster-ip-service
              servicePort: 6000
            path: /?(.*)
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: statics-ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /img/$1
spec:
  rules:
    - http:
        paths:
        - backend:
            serviceName: apollo-api-cluster-ip-service
            servicePort: 4000
          path: /img/?$(.*)
  

Моя текущая настройка выглядит так, как указано выше, но по неизвестной причине я не могу добраться до маршрута, настроенного вторым маршрутом.

Итак, что я пытаюсь сделать вместо этого, это объединить два маршрута вместе и предоставить префикс группе захвата, который соответствует /img

если я это сделаю

       - backend:
          serviceName: apollo-api-cluster-ip-service
          servicePort: 6000
        path: /?(.*)
  

он перенаправит все apollo-api , когда мне понадобится любой маршрут, который не начинается с /img , на который нужно перенаправить web-front

итак, мне нужно что-то вроде приведенного ниже

       - backend:
          serviceName: apollo-api-cluster-ip-service
          servicePort: 4000
        path: /img?(.*) <- somehow add /img to $(.*) because currently it rewrites `/img/static.png` -> `/static.png` but I need `/img/static.png` -> `/img/static.png`.
  

Любая помощь будет оценена.

Комментарии:

1. Как вы это решаете?

Ответ №1:

Как упоминалось в документации Rewrite Target:

!!! внимание, начиная с версии 0.22.0, определения входа с использованием аннотации nginx.ingress.kubernetes.io/rewrite-target не совместимы с предыдущими версиями. В версии 0.22.0 и выше любые подстроки в URI запроса, которые необходимо передать в перезаписанный путь, должны быть явно определены в группе захвата.

!!! примечание. Захваченные группы сохраняются в пронумерованных заполнителях в хронологическом порядке в виде $ 1, $ 2 … $ n. Эти заполнители можно использовать в качестве параметров в аннотации цели перезаписи.

Итак, я полагаю, что ваш второй вход должен выглядеть так:

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: statics-ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /img/$2
spec:
  rules:
    - http:
        paths:
        - backend:
            serviceName: apollo-api-cluster-ip-service
            servicePort: 4000
          path: /img(/|$)(.*)
  

В этом случае $2 будет отражено (.*)