Назад | Перейти на главную страницу

Балансировщик нагрузки Nginx и принудительное использование HTTPS

У меня есть сервер Nginx, который используется в качестве балансировщика нагрузки. Я только что установил SSL-сертификат с Let's Encrypt и сейчас ищу возможность принудительно использовать HTTP. Вот моя конфигурация:

upstream backend {
   server one.example.com;
   server two.example.com;
}

server {
   server_name example.com;
   location / {
      proxy_pass http://backend;
      proxy_set_header Host               $host;
      proxy_set_header X-Forwarded-Host   $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Real-IP          $remote_addr;
      proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
   }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;

    server_name example.com;
    return 404; # managed by Certbot
}

https запросы работают правильно, но http запросы бросают 301 перемещен навсегда, журналы доступа показывают следующее:

[07/Feb/2019:15:28:11 +0000] <ip> -> - | POST /api/test HTTP/1.1 | upstream_response_time - msec | request_time 0.000 msec | status: 301
[07/Feb/2019:15:28:11 +0000] <ip> -> <one.example.com IP>:80 | GET /api/test HTTP/1.1 | upstream_response_time 0.007 msec | request_time 0.007 msec | status: 405

(мой формат журнала '[$time_local] $remote_addr -> $upstream_addr | $request | upstream_response_time $upstream_response_time msec | request_time $request_time msec | status: $status'

В возврат 301 похоже, изменяет тип запроса с POST на GET (что не позволяет конечное приложение). У меня очень похожие настройки на веб-серверах без балансировки нагрузки, все работают, как ожидалось.

Также важно отметить, что окончательный файл конфигурации был создан certbot.

Вы не можете перенаправить POST с 301 (насколько мне известно). если вы хотите безопасно отправить что-то POST (через https), сделайте POST напрямую через https, как если бы вы перенаправляли на свой сервер https, POST не защищен, пока вы не доберетесь до него.

Еще я видел, что вы можете сделать, это перенаправить с помощью 307, а не 301, который пытается сохранить POST, но вы теряете «постоянное» перенаправление 301.

ИНФОРМАЦИЯ по второй части: https://stackoverflow.com/questions/39280361/nginx-loses-post-variable-with-http-https-redirect

Но я бы реализовал первый, если у вас есть сертификат, отправьте что-нибудь через https.