web-dev-qa-db-ja.com

未知のホスト名に応答するnginx?

同じサーバーを指す2つのドメインがあります。1つはhomeと呼び、もう1つはwebと呼びます。

HTTPの場合はポート80、HTTPSの場合は443でnginxを実行しています。私のサーバー定義では、2つのサーバーを定義しました。

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}

実際には、問題なく動作します。ただし、homeと同じIPアドレスを指すwebにアクセスしようとすると、404などではなくwebが提供されます。

サーバー名と一致しない404リクエストにnginxを設定するにはどうすればよいですか?事物を404秒までバウンスするデフォルトサーバーを定義する必要がありますか?

7
Naftuli Kay

Httpの場合:

server {
    listen 80 default_server;
    server_name _;
    return 404;
}

Httpsの場合、実際にはnginxをssl cert/keyにポイントする必要があります。 documentation によると、nginxは「Host」ヘッダーのみを確認し、server_nameと一致する場合はTLS SNIを確認しません。これは、nginxがホストヘッダーを検査する前に、ssl接続を受け入れ/復号化できる必要があることを意味します。

server {
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>
    ssl_certificate_key <path to key>
    return 404;
}

証明書/キーは、任意の証明書/キーにすることができます。自己署名。

Cert/keyが指定されていない場合でも、nginxはそのようなdefault_serverを使用しようとし、ssl接続を受け入れることができないため失敗します。

10
andreycpp

Catchallサーバーブロックには、server_nameなどの無効な値を設定する必要がある_も必要です。このように、サーバーブロックは他のホスト名とは一致せず、最後の手段として使用されます。設定は次のようになります。

server {
    listen 80;
    listen 443 ssl;

    server_name _;

    return 404;
}
5
schuppentier

構成内の最初のサーバー{}はキャッチオールのようなものなので、表示されています。このようなものをlisten 80サーバーの前に追加します{}

server {
    return 404;
}

server {
    listen 80;
    server_name web;
    # ...
}

server {
    listen 443;
    server_name web;
    # ...
}
3
Mike