要求されたサイトがポート 80 でリッスンしていない場合、nginx は間違ったサイトにアクセスします。

要求されたサイトがポート 80 でリッスンしていない場合、nginx は間違ったサイトにアクセスします。

私は、サーバー ブロックと個別のディレクトリを使用して、本番環境 (www.myexample.com) と開発環境 (dev.myexample.com) の両方を 1 つのサーバー上に置き、両方ともポート 80 でリッスンしていました。これは問題なく動作しました。

これで、SSL 証明書をインストールし、サイト構成ファイルで SSL モードを有効にしました。同時に、リスニング ポートを 80 から 443 に変更したので、サイトはポート 80 では応答せず、ポート 443 でのみ応答するようになります。開発サイトは以前と同じように引き続き稼働しています。

今では、エラーではなく、開発サイトに接続すると表示されるようです。http://www.myexample.com

この問題を解決するために、実際の「デフォルト」サーバー ブロック (server_name を _ に設定) を追加し、ファイルが含まれていないディレクトリを指すようにしました。

もっと良い方法はありますか? 実際のデフォルト Web サイトが必要な場合、既知のホスト名に対しては表示したくありません。 www.myexaple.com:80 をリッスンするサーバー ブロックを作成し、何らかの方法ですべてのページ リクエストを拒否するように構成する必要があると思いますが、どうすればよいのでしょうか?

自分がホストしていないサイトからのリクエストに応答しないようにするにはどうすればよいでしょうか?

答え1

無効なホスト名を使用してデフォルト サーバーを構成することを常にお勧めします。これにより、ホスト ヘッダー フィールドが設定されていないクライアント (または構成していないホストを持つクライアント) が拒否されるようになります。

server {
    listen              [::]:80 backlog=65536 default_server deferred ipv6only=off rcvbuf=16k sndbuf=512k;
    server_name         _;
    return              403;
}

server {
    listen              [::]:443 backlog=65536 default_server deferred ipv6only=off rcvbuf=16k sndbuf=512k spdy ssl;
    server_name         _;
    ssl_certificate     certificates/_/pem;
    ssl_certificate_key certificates/_/key;
    return              403;
}

https://github.com/Fleshgrinder/nginx-configuration

ご覧のとおり、403 Access Forbidden ステータス コードが返されます。これは、私のユース ケースに最も適しているためです (以下のコメントを参照)。まったく何も返さない場合は、特別な nginx コード 444 を使用します。

関連情報