
foo.com
私は、Web サイトのメイン ドメインとサブドメインの両方をホストしている Nginx サーバーを持っていますbar.foo.com
。メイン ドメインの証明書しか持っていないので、サブドメインの HTTP リクエストのみが必要です。両方のサーバー ブロックを構成しましたが、すべてのリクエストは正常に機能し、http://foo.com
にリダイレクトされhttps://foo.com
、http://bar.foo.com
HTTP のままになります。
しかし、接続しようとすると問題が発生します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.com
Nginx が次のようなリクエストをリッスンしないようにするか、単に 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 リクエストのデフォルト ブロックに設定されています。
server
Nginx 構成ファイル内のブロックをコメント化し/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
ブロックに証明書を必要とするため、証明書を提供する必要があります。