Как настроить перенаправление (редирект) HTTP-запросов на уровне веб-сервера или балансировщика?

«Как настроить перенаправление (редирект) HTTP-запросов на уровне веб-сервера или балансировщика?» — вопрос из категории Веб-серверы и балансировка, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Перенаправление настраивается правилами, которые возвращают клиенту HTTP-статус 3xx (чаще всего 301 Moved Permanently или 302 Found) с заголовком Location, содержащим новый URL.

1. Nginx (самый распространенный случай):

# Перенаправление с HTTP на HTTPS для всего трафика.
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# Перенаправление конкретного пути.
location /old-page {
    return 301 https://example.com/new-page;
}

2. Apache:

# Включение модуля mod_rewrite (обычно требуется).
# Перенаправление на HTTPS.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# Альтернативно, с помощью директивы Redirect.
Redirect 301 /old-path https://example.com/new-path

3. Балансировщик нагрузки (HAProxy):

frontend http-in
    bind *:80
    # Редирект всего HTTP-трафика на HTTPS.
    redirect scheme https code 301 if !{ ssl_fc }
    # Редирект конкретного URL.
    acl is_old_url path_beg /legacy-api
    redirect location https://example.com/new-api code 301 if is_old_url

4. Облачные балансировщики (AWS ALB): Перенаправление настраивается через правила слушателя (Listener Rules) в консоли AWS или через Terraform:

resource "aws_lb_listener_rule" "redirect_http_to_https" {
  listener_arn = aws_lb_listener.http.arn
  action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
  condition {
    path_pattern {
      values = ["/*"]
    }
  }
}

Ключевой момент: Используйте статус 301 для постоянных переездов (кэшируется браузерами и поисковиками), 302 — для временных.