nginx https 443 redirecionamento de nenhum subdomínio para subdomínio 'www'

2

Minha configuração:

server {
  listen 80;
  server_name mydomain.com;
  rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}

server {
  listen 80;
  server_name www.mydomain.com;
  return 301 https://www.mydomain.com$request_uri;

  if ($host !~* ^(www.mydomain.com)$ ) {
    return 444;
  }
}

server {
  listen 443;
  server_name www.mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;

  ...
}

O que funciona :

  • redirecionamento de mydomain.com para www.mydomain.com
  • redirecionamento de www.mydomain.com para https://www.mydomain.com

O que NÃO funciona corretamente:

  • quando eu digito https://mydomain.com diretamente no navegador, o redirecionamento para www.mydomain.com simplesmente não ocorre, mas a solicitação é passada para o servidor de aplicativos como https://mydomain.com
    • aparece como se a porta 80 "entrada" estivesse sendo ignorada e o servidor estivesse sendo acessado diretamente na porta 443, mas eu não sou um especialista em Nginx, então não posso dizer

Qual é a solução para o problema https://mydomain.com acima?

    
por Joseph Victor Zammit 22.01.2014 / 16:51

3 respostas

2

Use uma instrução if no seu bloco de servidor SSL para verificar o host:

server {
  listen 443;
  server_name www.mydomain.com mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;



  if ($host = 'mydomain.com' ) {
     rewrite  ^/(.*)$  https://www.mydomain.com/$1  permanent;
  }

  ...
}
    
por 22.01.2014 / 17:06
0

Como eu suspeitava, o motivo era porque a porta 80 estava sendo ignorada e a porta 443 acessada diretamente. A adição do seguinte bloco server permitiu o redirecionamento:

server {
  listen 443;
  server_name mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}

Se alguém souber de uma solução melhor ou mais elegante, adicione sua resposta.

    
por 22.01.2014 / 17:03
0

Eu prefiro evitar se, porque se é mal , também prefiro usar return over rewrite porque ele não precisa ser executado um motor regex.

server {
  #default server that catches all undefined host names
  listen 80 default_server;
  return 444;
}
server {
  #redirecting server for non-www ssl and non ssl domains
  listen 80;
  liste 443 ssl;
  server_name mydomain.com;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  return 301 https://www.mydomain.com$request_uri$is_args$query_string;
}
server {
  # redirecting server for www non ssl server
  listen 80; 
  server_name www.mydomain.com;
  return 301 https://mydomain.com$request_uri$is_args$query_string;
}
server {
  # main server config
  listen 443 ssl;
  server_name www.mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  # remaining config...
}
    
por 22.01.2014 / 17:44