Eu quero criar uma regra no nginx que faça duas coisas:
- Remove o "www". do URI da solicitação
- Redireciona para "https" se o URI da solicitação for "http"
Existem muitos exemplos de como fazer cada uma dessas coisas individualmente, mas não consigo descobrir uma solução que faça as duas coisas corretamente (ou seja, não crie um loop de redirecionamento e lide com todos os casos corretamente).
Ele precisa lidar com todos esses casos:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Todos eles devem terminar em https://example.com/path (nº 4) sem loop. Alguma ideia?
Respostas:
A melhor maneira de fazer isso é usar três blocos de servidor: um para redirecionar http para https, um para redirecionar o https www-name para no-www e outro para realmente manipular solicitações. O motivo para usar blocos extras de servidor em vez de ifs é que a seleção do servidor é realizada usando uma tabela de hash e é muito rápida. Usar um if no nível do servidor significa que o if é executado para cada solicitação, o que é um desperdício. Além disso, capturar a uri solicitada na reescrita é um desperdício, pois o nginx já possui essas informações nas variáveis $ uri e $ request_uri (sem e com a string de consulta, respectivamente).
fonte
https://example.com/
www.sub.example.com
parasub.example.com
e, em seguida, obter apenas um certificado SSL parasub.example.com
Agora eu sei que a verificação de certificado SSL acontece antes do redirecionamento 301, para que não funcione. Mais explicações aqui: serverfault.com/a/358625/144811Isso funciona para mim:
Tenha em mente que tanto
yourdomain.com
ewww.yourdomain.com
deve estar em seu certificado SSL. Isso é possível com um certificado curinga ou com um Nome alternativo do servidor, conforme explicado aqui . Verifique https://www.startssl.com para obter certificados legais e gratuitos que fazem isso. ( Edith : a partir da versão 56 do Chrome, os certificados openssl não serão mais confiáveis. Tente https://letsencrypt.org/ .)fonte
include
regra para adicioná-lo aos dois blocos do servidor SSL.Depois de passar tanto tempo com centenas de casos semelhantes, criei o seguinte snippet. É curto e pode ser facilmente ajustado para caber em qualquer coisa.
Sim pode ser. Mas existe por uma razão e não deve prejudicar quem sabe usá-lo adequadamente. ;)
fonte
Prefiro retornar com um código de resposta para que o navegador saiba que você está redirecionando para outro URL.
outro bloco de configurações do servidor para o
https
fonte
Que tal criar um bloco de servidor para esse fim:
reiniciando o nginx
fonte
https://www.example.com
parahttps://example.com
bem.Eu acho que isso deve funcionar.
Na sua definição simples de servidor HTTP, sugerimos algo como anthonysomerset, ou seja:
Em seguida, na sua definição de servidor SSL:
Dessa forma, o redirecionamento deve ocorrer apenas uma vez por solicitação, independentemente do URL para o qual o usuário acessa originalmente.
fonte
if ($host = 'www.example.com') {
já que seu regex não estava funcionando para mim. Não faço ideia do porquê, como parece correto.Aqui está o exemplo completo que acabou funcionando para mim. O problema era que eu não tinha os detalhes do ssl (
ssl_certificate
, etc.) no bloco de redirecionamento www. Lembre-se de verificar seus logs (sudo tail -f /var/log/nginx/error.log
)!fonte