Como redirecionar um URL no NGINX

135

Preciso redirecionar toda solicitação http://test.com para http://www.test.com . Como isso pode ser feito.

No bloco do servidor, tentei adicionar

 rewrite ^/(.*) http://www.test.com/$1 permanent;

mas no navegador diz

  The page isn't redirecting properly

  Firefox has detected that the server is redirecting the request for 
  this address in a way that will never complete.

meu bloco de servidor se parece

 server {
            listen       80;
            server_name  test.com;
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            #rewrite ^/(.*) http://www.test.com/$1 permanent;
            #rewrite ^(.*)$ $scheme://www.test.com$1;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }
Amal Kumar S
fonte
A documentação oficial está em: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Respostas:

274

A melhor maneira de fazer o que você deseja é adicionar outro bloco de servidor:

server {
        #implemented by default, change if you need different ip or port
        #listen *:80 | *:8000;
        server_name test.com;
        return 301 $scheme://www.test.com$request_uri;
}

E edite sua variável principal server_name do bloco do servidor da seguinte maneira:

server_name  www.test.com;

Importante : Novo serverbloco é o caminho certo para fazer isso, ifé mau . Você deve usar locais e servidores em vez de, ifse possível. Rewriteàs vezes também é ruim , então substitua-o por return.

Dmitry Verhoturov
fonte
19
Você também pode finalizar esse bloco do servidor com, em return 301 http://wwww.test.com$request_uri;vez de reescrever.
RCCola
6
idem @RCCola em usar em returnvez de rewrite. Veja docs
JCotton
Pergunta, como os blocos do servidor devem ser pedidos? o redirectentão o main serverbloco ou main serverbloco então o redirect? Porque eu tenho o mesmo problema, stackoverflow.com/questions/35451929/...
jhnferraris
A configuração do Nginx na pergunta mencionada está correta, a ordem não importa.
Dmitry Verhoturov
4
Apenas um aviso rápido: cuidado com o 301redirecionamento x 302. Você pode ficar com um redirecionamento permanente em cache, o que torna muito problemático alterar suas configurações para clientes que já acessaram uma URL. (Eu sei que o OP pediu uma 301, mas ter certeza de que é realmente o que você quer.)
Nick Merrill
16

Semelhante a outra resposta aqui, mas altere o http na reescrita para $ esquema da seguinte maneira:

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}

E edite sua variável principal server_name do bloco do servidor da seguinte maneira:

server_name  www.test.com;

Eu tive que fazer isso para redirecionar www.test.com para test.com.

Damien Justin Šutevski
fonte
9

Primeiro, verifique se você instalou o Nginx com o módulo de reescrita HTTP. Para instalar isso, precisamos ter pcre-library

Como instalar a biblioteca do pcre

Se o mencionado acima estiver pronto ou se você já os tiver, adicione o código abaixo no bloco do servidor nginx

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

Para remover www de cada solicitação, você pode usar

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

para que o bloco do servidor pareça

  server {
            listen       80;
            server_name  test.com;
            if ($host !~* ^www\.) {
                    rewrite ^(.*)$ http://www.$host$1 permanent;
            }
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }
Amal Kumar S
fonte
2

Este é o principal hit do Google para o "redirecionamento nginx". Se você chegou aqui apenas desejando redirecionar um único local:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Seph Reed
fonte