Гид по технологиям

Перенаправление bare‑domain на www с помощью Nginx Ingress

7 min read Kubernetes Обновлено 06 Dec 2025
Перенаправление на www через Nginx Ingress
Перенаправление на www через Nginx Ingress

Графика с логотипом Kubernetes

Если вы хотите, чтобы пользователи всегда попадали на один канонический адрес сайта, настроьте перенаправление с корневого домена (example.com) на поддомен www (www.example.com). В Nginx Ingress это делается простой аннотацией nginx.ingress.kubernetes.io/from-to-www-redirect: “true” и указанием обоих хостов в секции tls. Для окружений разработки используйте переменные Helm или условную логику, чтобы перенаправление включалось только в production.

Введение

Многие публичные веб‑сайты используют www‑версию домена как каноническую. Это помогает уникализировать адреса в поисковых системах, упрощает SSL/TLS‑настройки и делает поведение сайта предсказуемым для пользователей. При размещении приложений в Kubernetes вы можете реализовать традиционное перенаправление с bare domain (корневого домена без www) на www с помощью контроллера Nginx Ingress без кастомных правок в конфигурации Nginx.

В этой статье вы получите:

  • понятный пример манифеста Ingress с включённым www‑редиректом;
  • пример для TLS/HTTPS и интеграции с cert-manager;
  • способ сделать домен переменной в Helm и условно отключать редирект в CI/стейджинге;
  • чек‑лист, методику тестирования и шаги отладки.

Важно

Добавление аннотации активирует внутреннюю логику перенаправления в контроллере nginx‑ingress. Вам не нужно писать собственные правила rewrite в конфигурации Nginx.

Быстрые ссылки

  • Использование аннотации
  • Настройка хостов
  • Добавление HTTPS
  • Делание домена переменной (Helm)
  • Обработка окружений разработки
  • Тестирование и отладка
  • Рекомендации по безопасности
  • Сводка

Использование аннотации

Nginx Ingress предоставляет аннотацию, которая включает встроенный механизм перенаправления между bare domain и www. Достаточно добавить в манифест Ingress следующее:

nginx.ingress.kubernetes.io/from-to-www-redirect: "true"

Эту аннотацию необходимо поместить в metadata.annotations вашего ресурса Ingress. Ниже приведён полный минимальный рабочий пример, который демонстрирует, как это выглядит в целом.

Настройка хостов

Добавьте хост в секцию rules. Достаточно одной строки host — укажите тот хост, который хотите считать каноническим (обычно www.example.com). Контроллер nginx‑ingress автоматически обработает запросы к bare domain и выполнит перенаправление.

Пример минимального Ingress (формат YAML сохранён):

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:

name: my-ingress

namespace: my-namespace

annotations:

kubernetes.io/ingress.class: nginx-ingress

nginx.ingress.kubernetes.io/from-to-www-redirect: “true”

spec:

rules:

  • host: www.example.com

http:

paths:

  • path: /

backend:

serviceName: my-service

servicePort: 80


Этот минимальный пример позволит увидеть редирект в действии: переход по bare domain немедленно перенаправит на www. Это гарантирует единый входной путь для пользователей.

## Добавление HTTPS

В продакшене почти всегда требуется HTTPS. Для корректной работы HTTPS обе версии хоста (example.com и www.example.com) должны быть покрыты одним сертификатом или разными сертификатами, применимыми к обоим хостам.

Обновлённый манифест с TLS (обратите внимание на дополнительные строки tls и аннотацию certmanager):

apiVersion: networking.k8s.io/v1beta1


kind: Ingress

metadata:

name: my-ingress

namespace: my-namespace

annotations:

kubernetes.io/ingress.class: nginx-ingress

certmanager.k8s.io/cluster-issuer: letsencrypt-prod

nginx.ingress.kubernetes.io/from-to-www-redirect: "true"

spec:

rules:

- host: www.example.com

http:

paths:

- path: /

backend:

serviceName: my-service

servicePort: 80

tls:

- hosts:

- example.com

- www.example.com

secretName: ingress-tls-secret

Ключевые моменты:

  • TLS секция должна содержать оба хоста, чтобы при подключении к любому из них сертификат совпадал с запрошенным именем.
  • Пример использует cert‑manager и ClusterIssuer letsencrypt‑prod. Если у вас нет cert‑manager, выполните его установку или используйте другой контроллер сертификатов.
  • Аннотация certmanager.k8s.io/cluster-issuer указывает, каким выпускателем генерировать TLS секрет.

Примечание

Вы можете использовать другой контроллер сертификатов. Для этого обновите аннотацию, указывая имя вашего issuer. Сам блок tls остаётся совместимым с большинством Kubernetes‑контроллеров сертификатов.

Делание домена переменной (Helm)

Чтобы не дублировать доменное имя в манифесте и упростить смену домена, превратите манифест в шаблон Helm. Предположим, что в values.yaml есть параметр ingressDomain.

Шаблон Ingress с использованием Helm (оставлен синтаксис Helm как в исходнике):

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:

name: my-ingress

namespace: my-namespace

annotations:

kubernetes.io/ingress.class: nginx-ingress

certmanager.k8s.io/cluster-issuer: letsencrypt-prod

nginx.ingress.kubernetes.io/from-to-www-redirect: “true”

spec:

rules:

  • host: {{ print “www.” .Values.ingressDomain }}

http:

paths:

  • path: /

backend:

serviceName: my-service

servicePort: 80

tls:

  • hosts:

  • {{ print .Values.ingressDomain }}

  • {{ print “www” .Values.ingressDomain }}

secretName: ingress-tls-secret


Преимущества использования переменной:

- Меняется одно значение в values.yaml — всё обновляется.
- Упрощается развертывание в CI/CD: можно динамически генерировать домен для каждой ветки.

## Обработка окружений разработки

Если ваш CI создаёт уникальные поддомены для каждой ветки (например, my-branch.example.com), автоматическое добавление www может быть некорректным. Решение — разделить переменные:

- ingressBase — базовый домен, например example.com
- ingressDomain — текущий домен для развертывания, например my-branch.example.com

Используйте условную логику Helm и включайте www‑редирект только в production, когда ingressDomain == ingressBase.

Пример условного блока в шаблоне Helm:

spec:


rules:

{{ if eq .Values.ingressDomain .Values.ingressBase }}

- host: {{ print "www." .Values.ingressDomain }}

{{ else }}

- host: {{ print .Values.ingressDomain }}

{{ end }}

http:

paths:

- path: /

backend:

serviceName: my-service

servicePort: 80

tls:

- hosts:

- {{ .Values.ingressDomain }}

{{ if eq .Values.ingressDomain .Values.ingressBase }}

- {{ print "www." .Values.ingressDomain }}

{{ end }}

secretName: {{ .Values.ingressTlsSecret }}

Когда вы разворачиваете в production, выставьте ingressDomain = ingressBase — условие выполнится и будет создана запись www. Для веточных окружений условие не выполнится, и редирект не будет включён.

Тестирование и проверка

Быстрый чек‑лист для проверки правильности настройки:

  • Убедитесь, что аннотация nginx.ingress.kubernetes.io/from-to-www-redirect: “true” присутствует.
  • Проверьте, что в spec.rules указан желаемый host (www или bare, в зависимости от логики).
  • В tls.hosts перечислены оба варианта домена, и секрет TLS указан верно.
  • Наличие секретов: kubectl get secret -n my-namespace ingress-tls-secret
  • Проверка редиректа: curl -I http://example.com
  • Проверка TLS: curl -vk https://example.com и https://www.example.com

Примеры команд для отладки:

  • Посмотреть Ingress ресурс: kubectl describe ingress my-ingress -n my-namespace
  • Посмотреть логи контроллера ingress‑nginx: kubectl logs -n ingress-nginx deploy/ingress-nginx-controller
  • Проверить правила nginx, сгенерированные контроллером (зависит от установки контроллера)

Критерии приёмки

  • HTTP запрос к example.com возвращает 301/308 с Location на https://www.example.com/
  • HTTPS доступ к example.com и www.example.com работает и сертификат валиден
  • Внутренние ссылки и мета‑теги указывают на канонический адрес (rel=canonical при необходимости)

Когда этот подход не сработает

  • DNS не настроен для обеих версий хоста — редирект не поможет, если имя не резолвится.
  • Внешние CDN/Proxy (Cloudflare, Fastly) могут перехватывать и изменять поведение редиректов; настройки нужно согласовать с провайдером.
  • HTTP Strict Transport Security (HSTS) с includeSubDomains может осложнить тестирование: браузер будет принудительно использовать HTTPS.
  • Сценарии с несколькими каноническими доменами (multi‑tenant) требуют иной логики, потому что одна универсальная переадресация может быть нежелательной.

Альтернативные подходы

  • Выполнить редирект на уровне приложения (например, в веб‑сервере или в коде приложения). Минус — дублирование логики во всех сервисах.
  • Использовать другой Ingress‑контроллер, например Traefik, который тоже поддерживает правила перенаправлений и middleware.
  • Настроить редирект на уровне DNS‑провайдера (если поддерживается) — часто менее гибко и не покрывает HTTPS правильно.

Модель мышления (ментальные эвристики)

  • Канонический хост = единая точка входа; всё остальное должно на него ссылаться.
  • TLS должен покрывать все видимые хосты одновременно, чтобы не было «страшных» исключений безопасности.
  • В CI/CD окружениях — отключаем «продуктовую» логику по умолчанию; включаем её только в production.

Фактбокс

  • Перенаправление предпочтительнее, чем дублирование контента с двух доменов — уменьшает риск дублированного индекса в поисковиках.
  • Аннотация nginx.ingress.kubernetes.io/from-to-www-redirect: “true” реализует поведение в контроллере nginx‑ingress без дополнительных rewrite‑правил.

Роли и чек‑листы

  • DevOps/SRE:

    • Проверить наличие аннотации и TLS‑секрета.
    • Убедиться, что cert‑manager настроен и ClusterIssuer корректен.
    • Настроить CI/CD для параметризации ingressDomain/ingressBase.
  • Разработчик:

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

    • Выполнить тесты редиректов (HTTP и HTTPS).
    • Протестировать поведение в браузерах и curl.

SOP для развёртывания

  1. Подготовить values.yaml с ingressDomain и ingressBase.
  2. Убедиться, что DNS для обоих хостов указывает на ваш LB/Ingress.
  3. Развернуть cert‑manager или убедиться в наличии подходящего issuer.
  4. Применить Helm chart/манифест.
  5. Проверить секрет TLS и состояние Ingress.
  6. Выполнить curl‑проверки и проконтролировать логи ingress‑контроллера.

Инцидентный план и откат

  • Если после изменения Ingress пользователи теряют доступ:
    • Откатить изменения манифеста (helm rollback или kubectl apply старой версии).
    • Проверить события Kubernetes: kubectl get events -n my-namespace.
    • Проверить доступ к секрету TLS и работоспособность контроллера.

Тесты и критерии приёмки

  • Тест 1: HTTP → проверка 301/308 к www

  • Тест 2: HTTPS оба хоста

  • Тест 3: Helm логика

    • Вход: values: ingressDomain != ingressBase
    • Ожидаемый результат: в конфигурации не создаётся host с www

Отладка: распространённые ошибки и их причины

  • Отсутствует секрет TLS: cert‑manager не выдал сертификат; проверьте ресурсы Certificate/Order/Challenge.
  • Аннотация игнорируется: проверьте, что вы используете контроллер ingress‑nginx (kubernetes.io/ingress.class).
  • DNS указывает не на Ingress: проверьте A/AAAA записи и балансировщик.

Рекомендации по безопасности

  • Всегда обеспечивайте HTTPS для обоих хостов.
  • Используйте HSTS в production, но будьте аккуратны при включении includeSubDomains.
  • Отключайте старые TLS‑версии и слабые шифры на уровне контроллера, если это поддерживается.

Примечание о конфиденциальности

Перенаправление само по себе не затрагивает пользовательские данные. Тем не менее, корректная настройка HTTPS обязательна для защиты данных в транзите и соответствия требованиям конфиденциальности.

Совместимость и миграция

  • Поддерживаемые версии: подход работает с общими версиями ingress‑nginx; проверьте документацию вашего релиза на предмет точного поведения аннотации.
  • При миграции с других контроллеров учитывайте отличия в синтаксисе аннотаций и middleware.

Сводка

  • Добавьте nginx.ingress.kubernetes.io/from-to-www-redirect: “true” в аннотации Ingress, чтобы автоматически перенаправлять с bare domain на www.
  • Убедитесь, что TLS покрывает оба хоста и cert‑manager (или другой issuer) корректно настроен.
  • Используйте Helm и условную логику, чтобы отключать www‑редирект в динамических окружениях.

Важно

После развёртывания проверьте клиентские и серверные лог‑файлы и выполните тесты, описанные в разделе тестирования. Правильная конфигурация снижает риск дублированного контента и улучшает поведение пользователей при доступе к вашему сервису.

Короткое резюме

Перенаправление bare‑domain → www с помощью Nginx Ingress — простое и масштабируемое решение для единообразного поведения сайта. Правильная конфигурация TLS и учёт CI/стейджинговых окружений делают его пригодным как для разработки, так и для production.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как устроить идеальную вечеринку для просмотра ТВ
Развлечения

Как устроить идеальную вечеринку для просмотра ТВ

Как распаковать несколько RAR‑файлов сразу
Инструменты

Как распаковать несколько RAR‑файлов сразу

Приватный просмотр в Linux: как и зачем
Приватность

Приватный просмотр в Linux: как и зачем

Windows 11 не видит iPod — способы исправить
Руководство

Windows 11 не видит iPod — способы исправить

PS5: как настроить игровые пресеты
Консоли

PS5: как настроить игровые пресеты

Как переключить камеру в Omegle на iPhone и Android
Руководство

Как переключить камеру в Omegle на iPhone и Android