Nginx はサブドメインの HTTPS リクエストをリッスンしません

Nginx はサブドメインの HTTPS リクエストをリッスンしません

foo.com私は、Web サイトのメイン ドメインとサブドメインの両方をホストしている Nginx サーバーを持っていますbar.foo.com。メイン ドメインの証明書しか持っていないので、サブドメインの HTTP リクエストのみが必要です。両方のサーバー ブロックを構成しましたが、すべてのリクエストは正常に機能し、http://foo.comにリダイレクトされhttps://foo.comhttp://bar.foo.comHTTP のままになります。

しかし、接続しようとすると問題が発生しますhttps://bar.foo.com。サブドメイン サーバー ブロックを 443 または SSL 要求をリッスンするように構成していないにもかかわらず、要求は処理され、証明書のホスト名が要求しているホスト名と異なるというブラウザからの警告が表示された後、取得するページはメイン ドメインからのものになりますfoo.com

つまり、どうやら、serverメイン ドメインの HTTPS リクエストのみをリッスンするはずだったブロックが、どういうわけかサブドメインの HTTPS リクエストもリッスンしているようです。このような状況は避けたいものです。

メインドメインの設定は次のとおりです。

server {
  listen       80;
  server_name  foo.com www.foo.com;

  return 301 https://$server_name$request_uri;
}

server {
  listen       443 ssl;
  server_name  foo.com www.foo.com;

  ssl                  on;
  ssl_certificate      /etc/nginx/cert/foo.com.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.com.key;
  ...

  location / {
    root   /var/www/foo.com/public_html;
    index  index.html index.htm;
  }
}

サブドメインの設定は次のとおりです。

server {
  listen       80;
  server_name  bar.foo.com www.bar.foo.com;

  location / {
    root   /var/www/bar.foo.com/public_html;
    index  index.html index.htm;
  }
}

以下は、Nginx 構成ファイルの一部です。

server {
  listen       80 default_server;
  listen       [::]:80 default_server;
  server_name  _;
  root         /usr/share/nginx/html;

  location / {
}

メインドメインの 443 サーバー ブロックのfoo.com後の削除を試みましたが、効果はありませんでした。listen

https://bar.foo.comNginx が次のようなリクエストをリッスンしないようにするか、単に 404 または 444 を返すようにしたいと思います。

答え1

ポート 443 に設定されているブロックは1 つだけなのでserver、これがポート 443 へのすべてのリクエストを処理するために nginx によって使用されるデフォルトの仮想サーバーになります。

ポート 443 (TLS) のデフォルト サーバーを追加するには、次の仮想ホストを追加します。

server {
    listen 443 default_server;
    server_name _;
    return 444;
}

答え2

解決策を見つけました。@Tero と @Cosmic が正しく指摘したように、serverメイン ドメインの唯一の 443 ブロックが、serverすべての 443 リクエストのデフォルト ブロックに設定されています。

serverNginx 構成ファイル内のブロックをコメント化し/etc/nginx/nginx.conf、次の 2 つのserverブロックを追加しました。

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

server {
  listen       443 ssl default_server;
  server_name  _;
  ssl_certificate      /etc/nginx/cert/foo.bar.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.bar.key;
  return 444;
}

最初のものは、すべての HTTP リクエストのデフォルト ブロックに設定されserver、一致しないリクエストはすべてドロップされます。同様に、2 番目のものは、一致しない 443 または HTTPS リクエストをすべてドロップします。

@Tero が提供した解決策は機能しません。Nginx はすべての SSLserverブロックに証明書を必要とするため、証明書を提供する必要があります。

関連情報