Na configuração do seu site, você precisará de dois server
blocos.
O primeiro escuta seu site na porta 80 e retorna uma resposta 301 (movido permanentemente) com o mesmo URL que o prefixo requerido com em https
vez dehttp
O segundo é onde você coloca todas as informações reais do seu site, e ele escuta 443 como qualquer outro site seguro.
Se uma solicitação chegar na porta 80, ela será refletida no primeiro bloco e a solicitação subsequente (presumindo que o redirecionamento seja seguido corretamente) atingirá o segundo como planejado. O 301 tem o benefício adicional de ser armazenado em cache do lado do cliente, o que impedirá que solicitações subsequentes da mesma pessoa cheguem ao site inseguro.
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
...
}
Muitas outras soluções que vi queriam fazer reescritas de URL condicionais complexas. Achei que a solução acima é muito mais elegante.