2012-04-24 40 views
123

Necesito redireccionar cada solicitud http://test.com a http://www.test.com. ¿Cómo puede hacerse esto?Cómo redirigir una url en NGINX

En el bloque servidor He intentado añadir

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

pero en el navegador que 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 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; 
      } 
    } 
+0

La documentación oficial está en: http://nginx.org/en/docs/http/converting_rewrite_rules.html –

Respuesta

249

mejor manera de hacer lo que desea es añadir otro bloque 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 editar su principal variable de bloque servidor nombre_servidor de la siguiente manera:

server_name www.test.com; 

Importante: Nueva server bloque es la forma correcta de hacerlo, if is evil. Debe usar ubicaciones y servidores en lugar de if si es posible. Rewrite veces es evil too, por lo que lo reemplazó con return.

+18

También puede terminar ese bloque de servidor con 'return 301 http: //wwww.test.com$request_uri; 'en lugar de la reescritura. – RCCola

+5

ditto @RCCola sobre el uso de 'return' en lugar de' rewrite'. Consulte [docs] (http://wiki.nginx.org/Pitfalls#Taxing_Rewrites) – JCotton

+0

Pregunta, ¿cómo deben ordenarse los bloques del servidor? el 'redireccionamiento' luego el bloque 'servidor principal' o el bloque' servidor principal' luego el 'redireccionamiento' Porque tengo el mismo problema, http://stackoverflow.com/questions/35451929/nginx-redirecting-non-www-to-www-with-request-uri-does-not-work – Jhn

6

primer lugar, asegúrese de haber instalado Nginx con el módulo de reescritura HTTP. Para instalar este necesitamos tener pcre-biblioteca

How to install pcre library

Si lo anterior se hace o si ya dispone de ellos, a continuación, sólo tiene que añadir el siguiente código en el bloque de servidor nginx

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

para eliminar www de cada petición puede utilizar

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

por lo que su bloque de servidor se verá 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; 
      } 
    } 
16

similares a otra respuesta aquí, pero cambiar el HTTP en la reescritura para el esquema de $ así:

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

y editar su principal variable de bloque servidor nombre_servidor de la siguiente manera:

server_name www.test.com; 

I tuvo que hacer esto para redirigir www.test.com a test.com.

Cuestiones relacionadas