¿Cómo redirigir a un dominio diferente usando NGINX?


136

¿Cómo puedo redirigir mydomain.comy cualquier subdominio *.mydomain.compara www.adifferentdomain.comusar NGINX?

Respuestas:


276

nombre_servidor admite coincidencias de sufijos utilizando la sintaxis .midominio.com:

server {
  server_name .mydomain.com;
  rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
}

o en cualquier versión 0.9.1 o superior:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}

1
¿No necesito poner un puerto para escuchar? por ejemplo, escuche 80. Tengo varios dominios que necesito redirigir a un dominio principal, pero mi servidor también tiene múltiples servidores virtuales para otros dominios.
Ryan

1
@Ryan La listendirectiva por defecto es el puerto 80 cuando no se especifica. En realidad es un poco más complicado que eso en general; vea los documentos de configuración de nginx para más detalles.
Yitz

2
¿Qué ?logra el final?
Dan Dascalescu

55
¿Cuál es la diferencia entre rewritey return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu

66
Los ? al final de una reescritura le dice a nginx que no agregue la cadena de consulta original. Como $request_uriya tiene la cadena de consulta, no es necesario agregarla nuevamente. La return 301sintaxis es más nueva, y no debería haber diferencia en el comportamiento entre los dos métodos, pero cuando originalmente respondí esta pregunta, muchas distribuciones no tenían la versión requerida, así que elegí la sintaxis más segura.
kolbyjack


15

¿Por qué usar el módulo de reescritura si puedes hacerlo return? Técnicamente hablando, returnes parte del módulo de reescritura, ya que puede leer aquí, pero este fragmento es más fácil de leer en mi humilde opinión.

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

También puedes darle una redirección 301.


1
¿Esto también mantendrá la ruta y los parámetros de consulta?
mpen

3
No, este ejemplo no hace que @Mark. Pero supongo que puede mezclar las respuestas anteriores para llegar a algo como esto:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen

En una nota al margen, en muchos casos, probablemente debería simplemente redirigir a https en lugar de preservar el esquema (es decir, usar https en lugar de $ esquema). Esto es por las mismas razones enlaces relativas al protocolo ahora se consideran obsoletos - en paulirish.com/2010/the-protocol-relative-url
mahemoff

@mahemoff Eso no es del todo cierto. Considere el caso de tener el servidor web detrás de un equilibrador de carga que está descargando SSL.
Sebastian Neira

11

Eso debería funcionar a través de HTTPRewriteModule .

Ejemplo reescribir de www.example.com a example.com:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}

eso solo redirige www.example.com a example.com. Quiero redirigir ambos a un dominio diferente. ¿Puedo hacer eso en una regla?
deb

No estoy seguro, pero creo que server_name mydomain.com; reescribir www.adifferentdomain.com permanente; } ¿Deberías hacerlo? Eso debería tomar todo * .midominio.com?
Udo

@deb solo lo tendrías server_name example.com www.example.com;.
citruspi

La pregunta específicamente pide cualquier subdominio para redirigir a un dominio diferente . Esta respuesta no responde ninguno de los dos (explícitamente).
Kissaki

A este le falta el importante 301!
Sliq

9

Si desea redirigir las solicitudes de "dominio1.com" a "dominio2.com", puede crear un bloque de servidor que tenga este aspecto:

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

Es posible que alguien deba redirigir https: // request también. listen 443;
Rafik Farhad

0

Redireccionamiento temporal

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;

Redireccionamiento permanente

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;

En el archivo de configuración nginx para un sitio específico:

server {    
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;

}

0

Simplemente puede escribir una condición if dentro del bloque del servidor {}:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}

Debe tener cuidado al usar las declaraciones 'if' en Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). En este caso, puede usar 'server_name mydomain.com' en su lugar.
Marty

si es malo cuando se usa en contexto de ubicación, es seguro cuando se usa para especificar el host de redireccionamiento
cryptoKTM
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.