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

136

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

debutante
fuente

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;
}
kolbyjack
fuente
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.

Robin van Baalen
fuente
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; 
}
Tú haces
fuente
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;
}
ZanMax
fuente
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;

}
Taimoor Changaiz
fuente
0

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

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}
cryptoKTM
fuente
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