Em Nginx, mapeie subdomínios específicos para portas, redirecione todos os outros

7

Estou tentando realizar três coisas:

  1. Mapeie o tráfego, por subdomínio, para um dos vários aplicativos em portas diferentes.
  2. Se o subdomínio não for reconhecido, redirecione para www.
  3. Exigir HTTPS em todos os subdomínios.

Minha configuração do nginx até agora é:

map $subdomain $subdomain_port {
  default    8000;
  www        8000;
  subdomain1 8001;
  subdomain2 8002;
  subdomain3 8003;
}

server {
    listen 80;
    listen [::]:80;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen              443 ssl;
    server_name         ~^(?P<subdomain>.+?)\.mydomain\.com$;

    ssl_certificate     <cert>;
    ssl_certificate_key <key>;

    location / {
      # ... various proxy headers, then ...
      proxy_pass http://127.0.0.1:$subdomain_port;
      proxy_redirect off;
    }
}

Este quase funciona (realiza # 1 e # 3), mas em vez de redirecionar foo.mydomain.com para www.mydomain.com , ele apenas exibe o www content sem redirecionar. Não tenho certeza de como redirecionar subdomínios não mapeados sem dividir a coisa toda em blocos server separados, o que eu realmente prefiro não fazer.

Existe uma maneira de redirecionar todos os subdomínios não mencionados explicitamente no mapa para www ?

    
por Don McCurdy 18.04.2016 / 04:22

3 respostas

1

Apenas implemente um servidor padrão. Aqui está o meu

server {
  listen      80 default_server;
  server_name _;
  return 302 https://www.example.com;
}

Você pode fazer qualquer ação que quiser.

    
por 18.04.2016 / 04:30
1

Apenas para dizer que, na AWS, eu precisava adicionar um registro A "* .staging.mydomain.com" no Route53 apontando para o mesmo IP da instância do EC2 (como o registro de "staging.mydomain.com")

    
por 09.07.2018 / 09:56
0

O seguinte funciona para mim ...

  1. Deixe a porta padrão ser diferente da porta para www.
  2. Deixe o Nginx ouvir na porta padrão e redirecione todo o tráfego para www.

Aqui está a alteração na configuração do Nginx para que funcione ...

map $subdomain $subdomain_port {
  default    8888;
  www        8000;
  subdomain1 8001;
  subdomain2 8002;
  subdomain3 8003;
}

server {
    listen 8888;
    server_name _;
    return 301 https://www.domainname.com/$request_uri;
}

# other configs remain the same

Eu usei 8888 como a porta padrão. Qualquer porta não utilizada deve funcionar.

    
por 18.04.2016 / 06:30