Pergunta

Eu vejo o nginx Documentação httPrewritemodule tem um exemplo para reescrever um domínio prefixado em www para um domínio não prefixado em www:

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

Como posso fazer o reverso-reescrever um domínio não prefixado em www em um domínio prefixado em www? Eu pensei que talvez pudesse fazer algo como o seguinte, mas o Nginx não gosta da declaração aninhada.

if ($host !~* ^www\.) {                       # check if host doesn't start with www.
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) {    # check host is of the form xxx.xxx (i.e. no subdomain)
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }
}

Além disso, eu queria que isso funcionasse para qualquer nome de domínio sem dizer explicitamente ao nginx para reescrever domain1.com -> www.domain1.com, domain2.com -> www.domain2.com, etc. Como tenho um grande número de domínios para reescrever .

Foi útil?

Solução 3

Bem, acho que realmente não preciso da declaração externa "se", já que estou apenas verificando os domínios do formulário xxx.xxx de qualquer maneira. O seguinte funciona para mim, embora não seja robusto. Deixe -me saber se houver uma solução melhor.

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

Editar: adicionado hífen à expressão regular, pois é um caractere válido em um nome de host.

Outras dicas

Conforme observado na documentação do nginx, você deve evitar usar o if Diretiva em Nginx sempre que possível, porque assim que você tiver um if Na sua configuração, seu servidor precisa avaliar todas as solicitações para decidir se deve corresponder a isso if ou não.

Uma solução melhor seria várias diretivas de servidor.

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

server {
        listen 80;
        server_name www.website.com;
        ... 
}

Se você está tentando servir um site habilitado para um SSL (HTTPS), você obteve mais ou menos três opções diferentes.

  1. Configure vários endereços IP com cada diretiva de servidor ouvindo em seu próprio IP (ou portas diferentes, se essa for uma opção para você). Essas opções precisam de certificados SSL para ambos Site.com e www.website.com, então você tem um certificado de curinga, um certificado UNI (vários domínios) ou apenas dois certificados diferentes.
  2. Faça a reescrita no aplicativo.
  3. Use o temido if diretivo.

Há também uma opção para usar o SNI, mas não tenho certeza se isso é totalmente suportado a partir de agora.

if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

Só é possível obter nomes de host válidos porque a solicitação nunca chegará ao seu servidor, portanto, não há necessidade de criar sua própria lógica de validação.

A documentação do NGINX adverte contra o uso de IF para reescrever. Por favor, veja o link aqui: http://wiki.nginx.org/pitfalls#server_name

HTTP e HTTPS sem condições IF:

server {
    listen          80;
    listen          443;
    server_name     website.com;

    return 301 $scheme://www.website.com$request_uri;
}
server {
    listen          80;
    listen          443 default_server ssl;
    server_name     www.website.com;

    # Your config goes here #
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top