Eu tenho uma página de inscrição em um subdomínio como: https://signup.example.com
Ele só deve ser acessível via HTTPS, mas estou preocupado que as pessoas possam, de alguma forma, encontrá-lo via HTTP e obter um 404.
Meu bloco html / server no nginx é assim:
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 serão http://signup.example.com
redirecionadas https://signup.example.com
? (FYI, eu sei que existem plugins Rails que podem forçar, SSL
mas esperava evitar isso)
nginx
ssl
redirect
ruby-on-rails
Callmeed
fonte
fonte
Respostas:
De acordo com as armadilhas do nginx , é um pouco melhor omitir a captura desnecessária, usando em seu
$request_uri
lugar. Nesse caso, acrescente um ponto de interrogação para impedir que o nginx dobre quaisquer argumentos de consulta.fonte
return 301 http://domain.com$request_uri;
return 301...
causa um erro "muitos redirecionamentos" enquanto o método de reescrita realmente funciona.return 301
funciona, a menos que (eu acho) você esteja ativando também para URLs corretos, ouvindo nas duas portas (exemplo de configuração. Acionando o problema: pegue a primeira resposta do serverfault.com/a/474345/29689 e omita a if )A melhor maneira descrita no manual oficial é usando a
return
diretiva:fonte
301 Moved Permanently
(seus links foram movidos permanentemente) e também reescreveuproxy_set_header X-Forwarded-Proto https;
listen 443;
no mesmo bloco?Esta é a maneira correta e mais eficiente se você quiser manter tudo em um bloco de servidor:
Tudo o mais acima, usar "reescrever" ou "se ssl_protocol" etc é mais lento e pior.
Aqui está o mesmo, mas ainda mais eficiente, ao executar apenas a reescrita no protocolo http, ele evita a necessidade de verificar a variável do esquema $ em cada solicitação. Mas, falando sério, é uma coisa tão pequena que você não precisa separá-los.
fonte
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.
fonte
If you are using the new dual HTTP and HTTPS server definition
então você deve separá-lo.return 301 https://$server_name$request_uri;
como este é o método preferido.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 o uso em
$server_name
vez de$host
sempre redirecionaria parahttps://site1
.fonte
Note that using $server_name instead of $host would always redirect to https://site1
não$request_uri
é para isso que serve?$request_uri
não contém um host ou nome de domínio. Em outras palavras, sempre começa com um caractere "/".Certifique-se de definir 'seguro' em qualquer cookie, caso contrário, eles serão enviados na solicitação HTTP e poderão ser capturados por uma ferramenta como o Firesheep.
fonte
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 esqueça de reiniciar o serviço nginx depois de salvar a configuração.
fonte
rewrite ^ https://$host$request_uri? permanent;
seria uma solução melhor que você pode ter vários nomes de servidor em um vhostEu acho que essa é a solução mais simples. Força o tráfego não HTTPS e não WWW apenas para HTTPS e www.
EDIT - Abr 2018: Solução sem IF pode ser encontrada no meu post aqui: https://stackoverflow.com/a/36777526/6076984
fonte