#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
, модификатор расположения регулярных выражений без учета регистра будет применен ко ВСЕМ путям для данного хоста, независимо от того, на каком входе они определены.
[Ссылка]