Nginx が誤って書き換える

Nginx が誤って書き換える

何らかの理由で、www.server-1.com/forum は forum.server-1.com ではなく www.server-2.com にリダイレクトされます。www.server-1.com を www.server-2.com にリダイレクトする部分を削除すると、うまく機能します... まあ、完全には機能しません。URL が /forum で終わらず、たとえば /forum/index.php で終わる場合は、forum の後の最初のスラッシュが何らかの理由でプロセスで失われるからです。

# 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;
}

答え1

nginx は、ディレクティブを必ずしも設定ファイル内の順序で処理するわけではありません。サーバー レベルの書き換えディレクティブは、場所の選択の前に処理されます。これが、表示されている動作の理由です。サーバー内のすべてが書き換えであるため、次のように使用できるはずです。

server {
  server_name www.server-1.com;

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

関連情報