同じサーバーを指す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秒までバウンスするデフォルトサーバーを定義する必要がありますか?
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接続を受け入れることができないため失敗します。
Catchallサーバーブロックには、server_name
などの無効な値を設定する必要がある_
も必要です。このように、サーバーブロックは他のホスト名とは一致せず、最後の手段として使用されます。設定は次のようになります。
server {
listen 80;
listen 443 ssl;
server_name _;
return 404;
}
構成内の最初のサーバー{}はキャッチオールのようなものなので、表示されています。このようなものをlisten 80サーバーの前に追加します{}
server {
return 404;
}
server {
listen 80;
server_name web;
# ...
}
server {
listen 443;
server_name web;
# ...
}