redirecionar subdomínios curinga para https (nginx)

20

Tenho uma certificação SSL curinga e estou tentando redirecionar todo o tráfego não SSL para SSL. Atualmente, estou usando o seguinte para redirecionar o URL não subdomainded que está funcionando bem.

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

quando faço a mesma coisa para * .mydomain.com, ele redireciona logicamente para

https://%2A.mydomain.com/

Como você redireciona todos os subdomínios para seus equivalentes https?

O que, o que
fonte
2
Em vez de $ server_name, por que não $ host?
CJC

Respostas:

47

Isso é tudo...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}
cadmi
fonte
2
Um pouco mais de explicação pode fazer dessa uma resposta melhor.
Dave M
3
@ Dave-m, isso precisa ser explicado? $hostvariável? $request_uri?
cadmi
Ele não funciona, ainda tem https: //%2A.handy.travel/ #
Damon Yuan
2

A documentação oficial do NGINX incentiva o uso da diretiva de retorno em vez de a diretiva de reescrita para efetuar o redirecionamento. É assim, pois a solicitação que está sendo reescrita não se destina a esse servidor, mas ainda é processada nesse bloco de servidores. Portanto, os redirecionamentos são feitos corretamente com uma diretiva de retorno, pois todo o processamento é interrompido e a resposta é enviada imediatamente. O NGINX desencoraja a reescrita para redirecionamento aqui: http://nginx.org/en/docs/http/converting_rewrite_rules.html

A sintaxe da diretiva de retorno é: URL do código de retorno; Como você estava originalmente reescrevendo permanentemente, pode usar 301 como código para responder, indicando que é um redirecionamento permanente. Seu endereço https será passado na seção de URL. Referência: http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

Portanto, sua configuração correta seria

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

Provavelmente, você poderá redirecionar corretamente para o seu domínio SSL, com um bloco de servidor curinga. Você também pode tentar o nome do servidor genérico sublinhado '_' ou $ host, conforme sugerido no comentário acima. Nos informe!

Apurva Sukant
fonte
Embora o uso returnseja geralmente melhor, a configuração sugerida não está correta, pois ainda usa $ server_name para o redirecionamento, que será "* .mydomain.com". A correção correta já foi descrita por @cjc no comentário acima - $hostdeve ser usada em vez de $server_name.
Maxim Dounin
Sim combinado. Ah, parece que minha atenção está se desvanecendo!
Apurva Sukant 12/12/12
Em vez da depreciação acima, permita-me oferecer uma dica com sua configuração de SSL, que deve melhorar significativamente o desempenho. A maneira mais eficiente de configurar o SSL se você estiver usando o certificado curinga é configurar o 'grampeamento ssl'. Isso permite que você configure o SSL uma vez no servidor padrão para todos os subdomínios e salva a autenticação SSL separada para cada subdomínio. ssl_stapling on; resolvedor 8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify ativado; Refference- calomel.org/nginx.html
Apurva Sukant
2
Deve serreturn 301 https://$host$request_uri;
scarver2
Estou ouvindo as portas 80, 8080 e 8181 return 301 https://$server_name$request_uri;para que usem https na porta 443. O problema é que o URL redirecionado ainda tem o número da porta original. 80 não é um problema, mas 8080 sai comohttps://example.com:8080
A.Grandt 4/16
-1

Tente algo como isto:

server {
  listen 80;
  server_name ~^(.*)\.mydomain\.com$;
  set $servername $1;
  rewrite ^(.*)$ https://$servername.mydomain.com/$1;
}

O problema é definir o servidor curinga e fazer redirecionamentos com base em seu nome.

Andrei Mikhaltsov
fonte
Grupo regex excessivamente permissivo.
Kzqai #