Nginx redireciona todos os domínios do domínio para todos os domínios e para o domínio.

2

Estou tentando fazer o nginx redirecionar todas as solicitações recebidas de qualquer domínio adicionando ou removendo um www. prefixo.

Isso é para um pequeno serviço de redirecionamento. Se você apontar www.any.domain para ele, ele deve redirecionar www.any.domain / * para any.domain / *. E se você apontar any.domain para ele, ele deve redirecionar any.domain / * para www.any.domain /*.

Isso não causará um loop de redirecionamento na prática, porque apenas um dos dois domínios (any.domain ou www.any.domain) estaria apontando para este serviço. O outro para o seu site em outro servidor.

Isso deve funcionar com qualquer domínio. Milhares de diferentes, então tem que ter uma correspondência curinga regex. O fato de que qualquer coisa na internet possa ser apontada não é uma preocupação da nginx, porque isso será tratado em uma camada acima / antes dela. Cada pedido com um cabeçalho HTTP_HOST terá um www ou não e, em ambos os casos, deve ser redirecionado, portanto, o servidor deve redirecionar todas as solicitações recebidas.

O caso em que um domínio não começa com www. é bastante fácil, mas não consigo descobrir como capturar os casos em que começa com www. e só use o resto do domínio.

Eu tentei pesquisar, mas a) quase ninguém redireciona os dois caminhos ao mesmo tempo, b) a maioria das pessoas só se preocupam com um domínio, então eles codificam e c) depois que você passa, as pessoas tendem a cantar "SE É MAL". Então isso não ajuda muito.

Isso é o que eu tenho no momento:

http {
  server {
    listen 80 default_server;
    server_name _;

    # add www. to URLs that don't start with it.
    if ($host !~* ^www\.) {
      rewrite ^(.*)$ http://www.$host$1 permanent;
    }

    # but what about URLs that DO start with www.? How do I remove it?
  }
}

Isso é para uso na configuração do DNS do seu site. Se você quiser que seu site seja exibido em mydomain.com, aponte mydomain.com para seu site e www.mydomain.com para esse redirecionador. Se você quiser que seu site seja exibido em www.mydomain.com, você aponta www.mydomain.com para o seu site e mydomain.com para esse redirecionador.

    
por Le Roux Bodenstein 17.11.2014 / 13:44

3 respostas

2

Use dois blocos de servidor

Isso é realmente nos documentos :

A named regular expression capture can be used later as a variable:

server {
    server_name   ~^(www\.)?(?<domain>.+)$;

    location / {
        root   /sites/$domain;
    }
}

Aplicado ao caso de uso na pergunta, o bloco de servidor necessário é, portanto:

server {
    server_name   ~^(www\.)(?<domain>.+)$;
    return 301 $scheme://$domain$request_uri;
}

Colocando tudo junto

As configurações do servidor completo necessárias para a pergunta seriam:

server {
    listen 80;
    server_name   ~^(www\.)(?<domain>.+)$;
    return 301 $scheme://$domain$request_uri;
}

server {
    listen 80 default_server;
    return 301 $scheme://www.$host$request_uri;
}

Desta forma, a configuração é muito simples, e não há uso de if (que geralmente falando deve ser evitado ).

    
por 17.11.2014 / 14:17
1

Similar e não testado, mas algo ao longo destas linhas:

http {
  server {
    listen 80 default_server;
    server_name _;

    # redirect www.foo.com -> foo.com    
    if ($host ~* ^www\.) {
      rewrite ^www\.(.*)$ http://$1 permanent;
    }
  }
}
    
por 17.11.2014 / 13:52
0

Parece que encontrei uma solução no link

http {
    server {
        listen 80 default_server;
        server_name _;

        if ($host !~* ^www\.) {
            rewrite ^(.*)$ $scheme://www.$host$1 permanent;
            break;
        }

        if ($host ~* ^www\.(.*)) {
            set $host_without_www $1;
            rewrite ^(.*)$ $scheme://$host_without_www$1 permanent;
            break;
        }
    }
}
    
por 17.11.2014 / 14:22

Tags