Cómo redirigir una url en NGINX

135

Necesito redirigir cada solicitud de http://test.com a http://www.test.com . ¿Cómo se puede hacer esto?

En el bloque del servidor intenté agregar

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

pero en el navegador dice

  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.

mi bloque de servidor 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
fuente
La documentación oficial está en: nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

Respuestas:

274

La mejor manera de hacer lo que quiere es agregar otro bloque 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;
}

Y edite su variable de bloque de servidor principal server_name de la siguiente manera:

server_name  www.test.com;

Importante : Nuevo serverbloque es la forma correcta de hacer esto, ifes malvado . Debe usar ubicaciones y servidores en lugar de ifsi es posible. Rewritea veces también es malo , así que lo reemplazamos con return.

Dmitry Verhoturov
fuente
19
También podría finalizar ese bloqueo del servidor con en return 301 http://wwww.test.com$request_uri;lugar de la reescritura.
RCCola
66
Lo mismo ocurre con @RCCola en returnlugar de usar rewrite. Ver documentos
JCotton
Pregunta, ¿cómo se deben ordenar los bloques del servidor? el redirectentonces el main serverbloque o main serverbloque entonces el redirect? Porque tengo el mismo problema, stackoverflow.com/questions/35451929/…
jhnferraris
La configuración de Nginx en la pregunta mencionada es correcta, el orden no importa.
Dmitry Verhoturov
44
Solo una advertencia rápida: ten cuidado con la 301redirección frente a 302. Podría estar atrapado con una redirección permanente en caché, lo que hace que sea muy problemático cambiar su configuración para clientes que ya han accedido a una URL. (Sé que el OP solicitó un 301, pero asegúrese de que eso es realmente lo que quiere.)
Nick Merrill
16

Similar a otra respuesta aquí, pero cambie el http en la reescritura a $ esquema de la siguiente manera:

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

Y edite su variable de bloque de servidor principal server_name de la siguiente manera:

server_name  www.test.com;

Tuve que hacer esto para redirigir www.test.com a test.com.

Damien Justin Šutevski
fuente
9

Primero asegúrese de haber instalado Nginx con el módulo de reescritura HTTP. Para instalar esto necesitamos tener pcre-library

Cómo instalar la biblioteca pcre

Si lo mencionado anteriormente está hecho o si ya lo tiene, simplemente agregue el código a continuación en su bloque de servidor nginx

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

Para eliminar www de cada solicitud, puede usar

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

para que su bloque de servidor se vea como

  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
fuente
3

Este es el principal éxito en Google para "redirección nginx". Si llegaste aquí solo queriendo redirigir una sola ubicación:

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