Nginx reescribe incorrectamente

Nginx reescribe incorrectamente

Por alguna razón, www.server-1.com/forum no redirige a forum.server-1.com sino a www.server-2.com. Cuando elimino la parte donde redirige www.server-1.com a www.server-2.com, funciona de maravilla... bueno, no del todo, ya que la primera barra después del foro se pierde de alguna manera en el proceso cada vez que La URL no termina en /forum sino, por ejemplo, en /forum/index.php.

# Redirect www.server-1.com/forum to forum.server-1.com
# Redirect www.server-1.com/forum/ to forum.server-1.com
# Redirect www.server-1.com/forums to forum.server-1.com
# Redirect www.server-1.com/forums/ to forum.server-1.com
# Redirect www.server-1.com to www.server-2.com
server {
  listen 80;

  server_name www.server-1.com;

  location = /forum {
    rewrite ^ http://forum.server-1.com redirect;
    break;
  }

  location /forum/ {
    rewrite ^/forum/(.*) http://forum.server-1.com$1 redirect;
    break;
  }

  location = /forums {
    rewrite ^ http://forum.server-1.com redirect;
    break;
  }

  location /forums/ {
    rewrite ^/forums/(.*) http://forum.server-1.com$1 redirect;
    break;
  }

  rewrite ^ http://www.server-2.com redirect;
}

# Redirect forum.server-1.com to www.server-3.com/forum (where the forum is hosted)
server {
  listen 80;

  server_name forum.server-1.com;

  rewrite ^(.*) http://www.server-3.com/forum$1 redirect;
}

# Redirect forums.server-1.com to forum.server-1.com
server {
  listen 80;

  server_name forums.server-1.com;

  rewrite ^(.*) http://forum.server-1.com$1 redirect;
}

# Redirect server-1.com and *server-1.com to www.server-1.com
server {
  listen 80;

  server_name server-1.com *.server-1.com;

  rewrite ^(.*) http://www.server-1.com$1 redirect;
}

Respuesta1

nginx no necesariamente procesa las directivas en el orden en que aparecen en el archivo de configuración. Las directivas de reescritura a nivel de servidor se procesarán antes de la selección de ubicación, lo que explica el comportamiento que está viendo. Dado que todo en el servidor es solo una reescritura, deberías poder usar esto:

server {
  server_name www.server-1.com;

  rewrite ^/forums?(.*) http://forum.server-1.com$1 redirect;
  return 302 http://www.server-2.com/;
}

información relacionada