ロゴWeb開発ブログ

Nginxのdefault_serverを作成しないと生じる問題

作成

昔、NginxのVirtual Hostsを利用して複数のWebサイトを公開していたとき、ポート80のdefault_serverは作成したがポート443のdefault_serverを作らなったことがある。

たとえば、次のようなnginx.confだとする。


server {
listen 80 default_server;
server_name _;
return 444;
}
server {
listen 443 ssl;
server_name aaa.com;
...
}
server {
listen 443 ssl;
server_name bbb.com;
...
}

この状態でhttp://www.bbb.comにアクセスしたとする。

httpsのためポート番号が443となるがwww.bbb.comというserver_nameは存在しない。

この場合、listen 443と書いた最初のserverがデフォルトサーバーとなり、こちらに振り分けられる。

結果、ブラウザのURLにはwww.bbb.comと表示されているのにaaa.comのWebサイトが表示されることになる。

Search consoleにWebサイトを登録してもうまくインデックスできない問題も生じていた。

また、IPアドレスでアクセスした場合もaaa.comに繋がってしまいよろしくない。

ポート443のdefault_serverも設定するには次のようにする。

ssl_reject_handshake onにすることでssl接続を切断することができる。


server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 444;
}

また、次のようにリダイレクトできたほうがSEOの観点からも良いので設定を変更する。

  • httpででアクセスされたときはhttpsにリダイレクト
  • www有りのURLでアクセスされたときは、www無しのURLにリダイレクト

server {
listen 80;
server_name aaa.com www.aaa.com;
return 301 https://aaa.com$request_uri;
}
server {
listen 443 ssl;
server_name www.aaa.com;
...
return 301 https://aaa.com$request_uri;
}