Maneira correta de redirecionar vários domínios em um host - NGINX

2

Neste exemplo, tenho quatro sites em dois CMSs diferentes e cinco domínios diferentes.

a.com sub.a.com b.com c.com estão no CMS1 | d.com está no CMS2

http deve redirecionar para https e a.com www.a.com www.sub.a.com para sub.a.com e www.b.com para b.com e www.c.com para c.com
www.d.com para d.com

Cada domínio tem seu próprio site separado, gerenciado pelo CMS comum. Por exemplo, isso significa que, mesmo que b.com e c.com usem o mesmo CMS, painel de administração e diretório raiz; as páginas que são servidas como frontend são completamente diferentes. Esta funcionalidade é tratada pelo CMS.

Devido a essa configuração, eu tenho 2 arquivos .conf para o NGINX, um para os domínios a-c e um para d.

Aqui vem o problema. Abaixo está o que eu tenho até agora, mas não funciona da maneira que descrevi acima. Os domínios www.a.com - www.c.com parecem redirecionar todos para sub.a.com . www.sub.a.com não redireciona para sub.a.com . Estou vendo tudo isso errado?

a.com.conf

server {
  listen 80;
  server_name a.com www.a.com sub.a.com www.sub.a.com b.com www.b.com c.com www.c.dom;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name www.a.com www.sub.a.com;
  return 301 https://sub.a.com$request_uri;
}

server {
  listen 443 ssl;
  server_name www.b.com;
  return 301 https://b.com$request_uri;
}

server {
  listen 443 ssl;
  server_name www.c.com;
  return 301 https://c.com$request_uri;
}

server {
  listen 443 ssl;
  server_name a.com sub.a.com b.com c.com;
  root /srv/a.com/www;
  include snippets/ssl-a.com.conf;
  include snippets/ssl-params.conf;
  # REST OF CONFIG
}

d.com.conf

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

server {
  listen 443 ssl;
  server_name www.d.com;
  return 301 https://d.com$request_uri;
}

server {
  listen 443 ssl;
  server_name d.com;
  root /srv/d.com/www;
  include snippets/ssl-d.com.conf;
  include snippets/ssl-params.conf;
  # REST OF CONFIG
}
    
por bskool 14.09.2017 / 10:45

2 respostas

4

Você deve usar $host em vez de $server_name se quiser que nginx escolha o nome que foi usado para fazer a solicitação. Consulte este documento para saber mais.

Por exemplo:

server {
    listen 80;
    server_name a.com www.a.com sub.a.com www.sub.a.com b.com www.b.com c.com www.c.dom;
    return 301 https://$host$request_uri;
}
    
por 14.09.2017 / 11:05
2

Na seção do servidor virtual HTTP, eu sempre usaria o domínio final como destino de redirecionamento.

Por exemplo, agora, quando uma solicitação chegar em http://www.b.com , ela será redirecionada para https://www.b.com e, em seguida, para https://b.com , causando dois redirecionamentos para o cliente até que ele alcance o destino final. No entanto, para fazer isso, é necessário usar uma expressão regular para o server_name e usar seu valor capturado no redirecionamento, por exemplo, assim:

server {
    listen 80;

    server_name ~^(?:www)?\.(<domain>.+)\.com$;
    return 301 https://$domain.com;
}

Esta expressão regular irá capturar tudo entre www. prefixo e .com sufixo em $ 1, ou se www. prefixo não existir, então tudo antes de .com . $1 é então usado como destino de redirecionamento.

Outro problema com sua configuração é a solicitação para http://www.a.com . O primeiro redirecionamento irá para https://www.a.com , que irá redirecioná-lo para https://sub.a.com , porque o segundo bloco server corresponde a esse domínio.

    
por 14.09.2017 / 13:10

Tags