0

serverとを使用してnginxリライトルールで遊んでいserver_nameます。ドキュメントは、優先順位については十分に単純で明確に聞こえますが、少し奇妙な動作が発生しているので、何かを見逃していないかどうかを確認したいと思います。

www.domain.comwww.domain.net、などwww.domain.info)以外のものをにリダイレクトしようとしていwww.domain.comます。www.domain.deにredirectoすることを除いてwww.domain.com/de

私には次のルールがあります:

server {
   server_name domain.de www.domain.de;
   rewrite ^(.*) http://www.domain.com/de$1 permanent;
}

server {
   server_name _;
   rewrite ^(.*) http://www.domain.com$1 permanent;
}

server {
   listen 80;
   server_name localhost domain.com www.domain.com;
   ...
}

ただし、このルールセットでは、常にすべての.comドメインをにリダイレクトするようwww.domain.com/deです。server一方、最初の2つのセグメントを反転すると、正常に機能します。

私は何か間違ったことをしていますか?サーバー名が明示的に指定されている場合、ルールの順序が重要なのはなぜですか?

4

2 に答える 2

2

適切な構成は次のとおりです。

server {
   listen 80;
   server_name domain.de www.domain.de;
   return 301 http://www.domain.com/de$request_uri;
}

server {
   listen 80 default_server;
   server_name _;
   return 301 http://www.domain.com$request_uri;
}

server {
   listen 80;
   server_name "" localhost domain.com www.domain.com;
   ...
}

server_name _;ただ人気のあるスタブです。server_nameディレクティブのデフォルト値は""で、"Host"ヘッダーなしでリクエストを処理します。クライアントがそれをまったく送信しない場合はserver_name ""、あなたのような構成でリダイレクトループが発生します。

ご覧ください:

于 2012-05-15T15:02:31.767 に答える
2

「これはデフォルトのサーバーです」という意味で使用server_name _;するのはよくある間違いです。これには特別な意味はありませんdefault_server。listenディレクティブのフラグを使用して、その2番目のサーバーをデフォルトとしてマークする必要があります。

server {
  listen 80 default_server;
  server_name _;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}
于 2012-05-15T12:31:00.093 に答える