У меня есть сервер 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.