<a id="path-regex-annotation-for-ingresses"></a>

# Сопоставление путей с помощью регулярных выражений

Здесь показано, как настроить пути в ресурсах Ingress и Mergeable Ingress
с помощью [аннотации](https://angie.software//anic/docs/configuration/annotations.md#annotations) `path-regex` и регулярных выражений.

Для аннотации `path-regex` возможны следующие значения:

- `case_insensitive` - этот модификатор удобно использовать для маршрутизации,
  когда регистр не важен, и вы хотите избежать проблем, например с неправильным вводом URL пользователями
  (запросы на `/Tea`, `/tea`, и `/TEA` будут направлены на один и тот же ресурс).
- `case_sensitive` - этот модификатор можно использовать для более строгого контроля маршрутизации,
  когда регистр имеет значение, например в API (`/User/123` и `/user/123` могут означать разные сущности).

Рекомендуем также ознакомиться с [работой директивы location в документации
Angie](https://angie.software//angie/docs/configuration/modules/http/index.md#location).

## Пример настройки ресурса Ingress

Чтобы настроить регулярные выражения для путей ресурса Ingress, выполните следующие шаги:

1. Добавьте в файл `cafe-ingress.yaml` аннотацию `angie.software/path-regex` со значением `case_sensitive`.

   ### Пример

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
       name: cafe-ingress
       annotations:
       angie.software/path-regex: "case_sensitive"
   spec:
       tls:
       - hosts:
           - cafe.example.com
           secretName: cafe-secret
       rules:
       - host: cafe.example.com
           http:
           paths:
               - path: /tea/[A-Z0-9]
               backend:
                   serviceName: tea-svc
                   servicePort: 80
               - path: /coffee/[A-Z0-9]
               backend:
                   serviceName: coffee-svc
                   servicePort: 80
   ```
2. Выполните команду:
   ```console
   kubectl create -f cafe-ingress.yaml
   ```

   Пути `tea` и `coffee` в конфигурации Angie будут выглядеть следующим образом:
   ```nginx
   location ~ "^/tea/[A-Z0-9]"
   ```

   ```nginx
   location ~ "^/coffee/[A-Z0-9]"
   ```

   #### NOTE
   Обратите внимание, что модификатор регулярного выражения `case_sensitive` применяется ко всем путям.
3. Если вы хотите изменить значение на `case_insensitive`, обновите файл.

   ### Пример

   ```yaml
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
          name: cafe-ingress
          annotations:
          angie.software/path-regex: "case_insensitive"
      spec:
          tls:
          - hosts:
          - cafe.example.com
          secretName: cafe-secret
          rules:
          - host: cafe.example.com
          http:
              paths:
              - path: /tea/[A-Z0-9]
              backend:
                  serviceName: tea-svc
                  servicePort: 80
              - path: /coffee/[A-Z0-9]
              backend:
                  serviceName: coffee-svc
                  servicePort: 80
   ```

   Теперь пути `/tea/[A-Z0-9]` и `/coffee/[A-Z0-9]` в конфигурации Angie будут выглядеть так:
   ```nginx
   location ~* "^/tea/[A-Z0-9]"
   ```

   ```nginx
   location ~* "^/coffee/[A-Z0-9]"
   ```

   #### NOTE
   Обратите внимание, что модификатор регулярного выражения `case_insensitive` применяется ко всем путям.

## Пример настройки ресурса Mergeable Ingress

### Создание Master Ingress и Minion Ingress

1. Создайте Master Ingress в файле `cafe-master.yaml`.

   ### Пример

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
       name: cafe-ingress-master
       annotations:
       angie.software/mergeable-ingress-type: "master"
   spec:
       ingressClassName: angie
       tls:
       - hosts:
       - cafe.example.com
       secretName: cafe-secret
       rules:
       - host: cafe.example.com
   ```
2. Выполните команду:
   ```console
   kubectl create -f cafe-master.yaml
   ```
3. Проверьте, что Master Ingress создан:
   ```console
   kubectl get ingress cafe-ingress-master

   NAME                  CLASS   HOSTS              PORTS     AGE
   cafe-ingress-master   angie   cafe.example.com   80, 443   29s
   ```

   ```console
   kubectl describe ingress cafe-ingress-master

   Name:             cafe-ingress-master
   Labels:           <none>
   Namespace:        default
   Address:
   Ingress Class:    angie
   Default backend:  <default>
   TLS:
   cafe-secret terminates cafe.example.com
   Rules:
   Host        Path  Backends
   ----        ----  --------
   *           *     <default>
   Annotations:  angie.software/mergeable-ingress-type: master
   Events:
   Type    Reason          Age   From                      Message
   ----    ------          ----  ----                      -------
   Normal  AddedOrUpdated  62s   angie-ingress-controller  Configuration for default/cafe-ingress-master was added or updated
   ```
4. Создайте первый Minion Ingress для `tea` в файле `tea-minion.yaml`.

   ### Пример

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
       name: cafe-ingress-tea-minion
       annotations:
       angie.software/mergeable-ingress-type: "minion"
   spec:
       ingressClassName: angie
       rules:
       - host: cafe.example.com
       http:
           paths:
           - path: /tea
           pathType: Prefix
           backend:
               service:
               name: tea-svc
               port:
                   number: 80
   ```
5. Выполните команду:
   ```console
   kubectl create -f tea-minion.yaml
   ```
6. Проверьте, что Minion Ingress создан:
   ```console
   kubectl get ingress cafe-ingress-tea-minion

   NAME                      CLASS   HOSTS              ADDRESS   PORTS   AGE
   cafe-ingress-tea-minion   angie   cafe.example.com             80      23m
   ```

   ```console
   kubectl describe ingress cafe-ingress-tea-minion

   Name:             cafe-ingress-tea-minion
   Labels:           <none>
   Namespace:        default
   Address:
   Ingress Class:    angie
   Default backend:  <default>
   Rules:
   Host              Path   Backends
   ----              ----   --------
   cafe.example.com
                     /tea   tea-svc:80 (10.244.0.6:8080,10.244.0.7:8080,10.244.0.8:8080)
   Annotations:        angie.software/mergeable-ingress-type: minion
   Events:
   Type    Reason          Age   From                      Message
   ----    ------          ----  ----                      -------
   Normal  AddedOrUpdated  24m   angie-ingress-controller  Configuration for default/cafe-ingress-tea-minion was added or updated
   ```
7. Создайте второй Minion Ingress для `coffee` в файле `coffee-minion.yaml`.

   ### Пример

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
   name: cafe-ingress-coffee-minion
   annotations:
       angie.software/mergeable-ingress-type: "minion"
   spec:
   ingressClassName: angie
   rules:
   - host: cafe.example.com
       http:
       paths:
       - path: /coffee
           pathType: Prefix
           backend:
           service:
               name: coffee-svc
               port:
               number: 80
   ```
8. Выполните команду:
   ```console
   kubectl create -f coffee-minion.yaml
   ```
9. Проверьте, что Minion Ingress создан:
   ```console
   kubectl get ingress cafe-ingress-coffee-minion

   NAME                         CLASS   HOSTS              ADDRESS   PORTS   AGE
   cafe-ingress-coffee-minion   angie   cafe.example.com             80      5m21s
   ```

   ```console
   kubectl describe ingress cafe-ingress-coffee-minion

   Name:             cafe-ingress-coffee-minion
   Labels:           <none>
   Namespace:        default
   Address:
   Ingress Class:    angie
   Default backend:  <default>
   Rules:
   Host              Path      Backends
   ----              ----      --------
   cafe.example.com
                     /coffee   coffee-svc:80 (10.244.0.6:8080,10.244.0.7:8080,10.244.0.8:8080)
   Annotations:        angie.software/mergeable-ingress-type: minion
   Events:
   Type    Reason          Age    From                      Message
   ----    ------          ----   ----                      -------
   Normal  AddedOrUpdated  5m52s  angie-ingress-controller  Configuration for default/cafe-ingress-coffee-minion was added or updated
   ```

Теперь у вас есть Master Ingress и два Minion Ingress. Два Minion Ingress определяются путями `/tea` и `/coffee`.

### Модификация путей с помощью регулярных выражений

Ниже показано, как изменить пути `/tea` и `/coffee` с помощью регулярных выражений.

1. Добавьте аннотацию `path-regex` со значением `case_insensitive`
   в Minion Ingress (`tea`) и измените путь с помощью
   регулярных выражений (в примере ниже: `/tea/[A-Z0-9]`).

   ### Пример

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
       name: cafe-ingress-tea-minion
       annotations:
       angie.software/mergeable-ingress-type: "minion"
       angie.software/path-regex: "case_insensitive"
   spec:
       ingressClassName: angie
       rules:
       - host: cafe.example.com
       http:
           paths:
           - path: /tea/[A-Z0-9]
           pathType: Prefix
           backend:
               service:
               name: tea-svc
               port:
                   number: 80
   ```
2. Примените изменения:
   ```console
   kubectl apply -f tea-minion.yaml
   ```
3. Проверьте, что изменения применились:
   ```console
   kubectl describe ingress cafe-ingress-tea-minion

   Name:             cafe-ingress-tea-minion
   Labels:           <none>
   Namespace:        default
   Address:
   Ingress Class:    angie
   Default backend:  <default>
   Rules:
   Host              Path            Backends
   ----              ----            --------
   cafe.example.com
                     /tea/[A-Z0-9]   tea-svc:80 (10.244.0.6:8080,10.244.0.7:8080,10.244.0.8:8080)
   Annotations:        angie.software/mergeable-ingress-type: minion
                       angie.software/path-regex: case_insensitive
   Events:
   Type    Reason          Age                From                      Message
   ----    ------          ----               ----                      -------
   Normal  AddedOrUpdated  47s (x2 over 34m)  angie-ingress-controller  Configuration for default/cafe-ingress-tea-minion was added or updated
   ```

   Добавленная аннотация `path-regex` обновляет путь `/tea/[A-Z0-9]`
   с использованием модификатора регулярного выражения `case_insensitive`.

   Обновленный путь (`location`) в конфигурационном файле Angie будет выглядеть так:
   ```nginx
   location ~* "^/tea/[A-Z0-9]"
   ```

   #### NOTE
   Обратите внимание, что аннотация `path-regex` применяется только к путям, определенным в соответствующем Minion Ingress (`tea`). Пути, определенные во втором Minion Ingress (`coffee`), не меняются.
4. Аналогичным образом используйте модификатор регулярного выражения `case_sensitive` для второго Minion Ingress (`coffee`) в файле `coffee-minion.yaml`.

   ### Пример

   ```yaml
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
       name: cafe-ingress-coffee-minion
       annotations:
       angie.software/mergeable-ingress-type: "minion"
       angie.software/path-regex: "case_sensitive"
   spec:
       ingressClassName: angie
       rules:
       - host: cafe.example.com
       http:
           paths:
           - path: /coffee/[A-Za-z0-9]
           pathType: Prefix
           backend:
               service:
               name: coffee-svc
               port:
                   number: 80
   ```
5. Примените изменения:
   ```console
   kubectl apply -f coffee-minion.yaml
   ```
6. Проверьте, что изменения применились:
   ```console
   kubectl describe ingress cafe-ingress-coffee-minion

   Name:             cafe-ingress-coffee-minion
   Labels:           <none>
   Namespace:        default
   Address:
   Ingress Class:    angie
   Default backend:  <default>
   Rules:
   Host              Path                 Backends
   ----              ----                 --------
   cafe.example.com
                    /coffee/[A-Za-z0-9]   coffee-svc:80 (10.244.0.10:8080,10.244.0.9:8080)
   Annotations:        angie.software/mergeable-ingress-type: minion
                       angie.software/path-regex: case_sensitive
   Events:
   Type    Reason          Age   From                      Message
   ----    ------          ----  ----                      -------
   Normal  AddedOrUpdated  11m   angie-ingress-controller  Configuration for default/cafe-ingress-coffee-minion was added or updated
   ```

   Добавленная аннотация `path-regex` обновляет путь `/coffee/[A-Za-z0-9]`, используя модификатор регулярного выражения `case_sensitive`.

   Обновленный путь в конфигурационном файле Angie будет выглядеть так:
   ```nginx
   location ~ "^/coffee/[A-Za-z0-9]"
   ```
