Как мне перенаправить URL www на URL, не относящийся к www, используя nginx-ingress-controller?

#redirect #kubernetes-ingress #nginx-ingress

#перенаправление #kubernetes-ingress #nginx-ingress

Вопрос:

Я пытаюсь получить URL www.example.com чтобы перенаправить себя на example.com сохраняя все об исходном запросе в k8s 1.11.1

Я пытаюсь сделать это с помощью простого входа, а затем использую аннотации для его перенаправления.

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/permanent-redirect: https://example.com
    nginx.ingress.kubernetes.io/ssl-redirect: "True"
  name: example-redirect
spec:
  tls:
  - hosts:
    - www.example.com
    secretName: example-tls
  rules:
  - host: www.example.com
    http:
      paths:
      - backend:
          serviceName: example
          servicePort: http
  

Проблема здесь в том, что я не хочу иметь никаких правил / серверной части. Я просто хочу перенаправить www.example.com для example.com используя вход, но входы k8s требуют от меня наличия правил. Существуют ли здесь какие-либо обходные пути?

Ответ №1:

На самом деле, ресурс Ingress имеет строго определенные предпосылки для соответствующей спецификации API. Вы можете исключить rules: поле из общей конфигурации, однако backend: оно должно быть определенно указано таким образом, чтобы входной контроллер Nginx мог направлять сетевой трафик к целевой конечной точке в случае, если правила не объявлены или не совпадают.

Всякий раз, когда вы создаете какие-либо конкретные настройки для Nginx Ingress controller с помощью аннотаций или конфигурационных карт, оба параметра выполняют одну и ту же работу по применению некоторой конкретной конфигурации к базовому nginx.conf файлу, который находится в nginx-ingress-controller Pod. Это означает, что Ingress controller применяет server {} и location {} блокирует соответствующий модуль веб-сервера Nginx для конкретного хоста:

 server {
        server_name www.example.com ;

        listen 80;

        listen [::]:80;

        set $proxy_upstream_name "-";

        listen 443  ssl http2;

        listen [::]:443  ssl http2;

        .............

        location / {

            set $namespace      "default";
            set $ingress_name   "example-redirect";
            set $service_name   "example";
            set $service_port   "http";
            set $location_path  "/";
            ......................
                   }
       }
  

Поэтому я полагаю, что вы можете захватить nginx.conf файл на основе конфигурации ресурса Ingress, а затем независимо применить его внутри модуля Ingress controller Pod.

Я предполагаю, что вы можете также рассмотреть возможность использования nginx.ingress.kubernetes.io/from-to-www-redirect: "true" аннотации для достижения цели в текущем сценарии.

Ответ №2:

Следующее должно сделать:

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($host = 'www.example.com' ) {
        rewrite ^ https://example.com$request_uri permanent;
      }
  name: example-redirect
spec:
  tls:
  - hosts:
    - www.example.com
    secretName: example-tls
  rules:
  - host: www.example.com
    http:
      paths:
      - backend:
          serviceName: example
          servicePort: http