Как переписать URL-адреса в нижний регистр в контроллере nginx на kubernetes

#kubernetes #seo #kubernetes-ingress #azure-aks #nginx-ingress

Вопрос:

У меня есть требование переписать все URL-адреса в нижний регистр.

Например, test.com/CHILD чтобы test.com/child

Интерфейсное приложение разработано в docker в службах azure kubernetes. Вход контролируется контроллером входа nginx.

Ответ №1:

Вы можете переписать URL-адреса с помощью Lua, как описано в статье Принудительное использование URL-адресов в нижнем регистре (NGINX).

Все, что нам нужно сделать, это добавить следующий блок конфигурации в nginx:

 location ~ [A-Z] {
    rewrite_by_lua_block {
        ngx.redirect(string.lower(ngx.var.uri), 301);
    }
}
 

Я покажу вам, как это работает.


Во-первых, я создал входной ресурс с ранее упомянутой конфигурацией:

 $ cat test-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/server-snippet: |
     location ~ [A-Z] {
        rewrite_by_lua_block {
            ngx.redirect(string.lower(ngx.var.uri), 301);
        }
      }
spec:
  rules:
  - http:
      paths:
      - path: /app-1
        pathType: Prefix
        backend:
          service:
            name: app-1
            port:
              number: 80
              
              
$ kubectl apply -f test-ingress.yaml
ingress.networking.k8s.io/test-ingress created

$ kubectl get ing
NAME           CLASS    HOSTS   ADDRESS          PORTS   AGE
test-ingress   <none>   *       <PUBLIC_IP>      80      58s
 

Затем я создал образец app-1 модуля и выставил его на порт 80 :

 $ kubectl run app-1 --image=nginx
pod/app-1 created

$ kubectl expose pod app-1 --port=80
service/app-1 exposed
 

Наконец, мы можем проверить, работает ли перезапись так, как ожидалось:

 $ curl -I <PUBLIC_IP>/APP-1
HTTP/1.1 301 Moved Permanently
Date: Wed, 06 Oct 2021 13:53:56 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: /app-1

$ curl -L <PUBLIC_IP>/APP-1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
 

Кроме того, в ingress-nginx-controller журналах мы можем видеть следующие записи в журнале:

 10.128.15.213 - - [06/Oct/2021:13:54:34  0000] "GET /APP-1 HTTP/1.1" 301 162 "-" "curl/7.64.0" 83 0.000 [-] [] - - - - c4720e38c06137424f7b951e06c3762b
10.128.15.213 - - [06/Oct/2021:13:54:34  0000] "GET /app-1 HTTP/1.1" 200 615 "-" "curl/7.64.0" 83 0.001 [default-app-1-80] [] 10.4.1.13:80 615 0.001 200 f96b5664765035de8832abebefcabccf
 

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

1. Большое спасибо !!

Ответ №2:

Контроллер ввода поддерживает регулярные выражения в поле без учета регистра spec.rules.http.paths.path . Это можно включить, установив nginx.ingress.kubernetes.io/use-regex для аннотации значение true (по умолчанию значение false). Для получения дополнительной информации, пожалуйста, проверьте здесь

Использование nginx.ingress.kubernetes.io/use-regex аннотации укажет, используют ли пути, определенные на входе, регулярные выражения. Значение по умолчанию равно false.

Ниже будет указано, что используются пути регулярных выражений:

 nginx.ingress.kubernetes.io/use-regex: "true"
 

Следующее будет указывать на то, что пути регулярных выражений не используются:

 nginx.ingress.kubernetes.io/use-regex: "false"
 

Когда для этой аннотации установлено значение true , модификатор расположения регулярных выражений без учета регистра будет применен ко ВСЕМ путям для данного хоста, независимо от того, на каком входе они определены.

[Ссылка]