Eu tenho uma página de inscrição em um subdomínio como:https://signup.example.com
Ele deve ser acessível apenas via HTTPS, mas estou preocupado que as pessoas possam de alguma forma tropeçar nele via HTTP e obter um 404.
Meu bloco html/server no nginx se parece com isso:
html {
server {
listen 443;
server_name signup.example.com;
ssl on;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
ssl_session_timeout 30m;
location / {
root /path/to/my/rails/app/public;
index index.html;
passenger_enabled on;
}
}
}
O que posso adicionar para que as pessoas que vão http://signup.example.com
sejam redirecionadas https://signup.example.com
? (Para sua informação, eu sei que existem plugins Rails que podem forçar, SSL
mas esperava evitar isso)
A melhor maneira, conforme descrito no tutorial oficial, é usando a
return
diretiva:De acordo com as armadilhas do nginx , é um pouco melhor omitir a captura desnecessária, usando
$request_uri
em vez disso. Nesse caso, acrescente um ponto de interrogação para evitar que o nginx dobre quaisquer argumentos de consulta.Esta é a maneira correta e mais eficiente se você quiser manter tudo em um bloco de servidor:
Todo o resto acima, usando "rewrite" ou "if ssl_protocol" etc, é mais lento e pior.
Aqui é o mesmo, mas ainda mais eficiente, executando apenas a reescrita no protocolo http, evita ter que verificar a variável $scheme em cada solicitação. Mas falando sério, é uma coisa tão pequena que você não precisa separá-los.
Se você estiver usando a nova definição de servidor HTTP e HTTPS duplo, poderá usar o seguinte:
Isso parece funcionar para mim e não causa loops de redirecionamento.
Editar:
Substituído:
com a linha de reescrita de Pratik.
Ainda outra variante, que preserva o cabeçalho Host: request e segue o exemplo "GOOD" nas armadilhas do nginx :
Aqui estão os resultados. Observe que usar
$server_name
em vez de$host
sempre redirecionaria parahttps://site1
.Isso funciona melhor eu acho. xxxx refere-se ao IP do seu servidor. Se você estiver trabalhando com o Plesk 12, poderá fazer isso alterando o arquivo "nginx.conf" no diretório "/var/www/vhosts/system/domain.tld/conf" para o domínio que desejar. Não se esqueça de reiniciar o serviço nginx depois de salvar a configuração.
Acho que esta é a solução mais simples. Força o tráfego não HTTPS e não WWW somente para HTTPS e www.
EDIT - abril de 2018: Solução sem IFs pode ser encontrada no meu post aqui: https://stackoverflow.com/a/36777526/6076984