Nginxの設定においてリクエストがserver_nameに合致しない場合などの挙動への理解が曖昧だったのでserver_name周りについて調べてまとめました。
リクエスト処理の流れについてはこちら参考
1. server_name の基本
server_nameは、Host ヘッダーに基づいてリクエストをどのserverブロックで処理するかを決める設定。
e.g. http://example.comのリクエストが以下のserverに割り当てられる。
server {
listen 80;
server_name example.com;
}
2. server_name のマッチングルール
- 完全一致(Exact Match)
-
server_name example.com;->Host: example.comに完全一致した場合のみ適用 -
www.example.comには適用されない
-
- ワイルドカード(*.example.com)
- 先頭(
*.example.com)または末尾(example.*)にワイルドカードを使用可能 -
server_name *.example.com;->www.example.comやapp.example.comにマッチする - ただし、
example.comにはマッチしない
- 先頭(
- 正規表現(Regex Match)
-
~を付けると、正規表現(PCRE)でマッチ -
server_name ~^www\d+\.example\.com$;->www1.example.com,www2.example.comなどにマッチ
-
3. server_name の優先順位
リクエストがNginxに届いたとき、次の順でserver_nameを評価する
- 完全一致(Exact Match)が最優先
- ワイルドカード(前方一致 .example.com や example.)
- 正規表現(Regex Match ~^www\d+.example.com$)
- デフォルトの server(default_server の指定があるもの or 最初の server)
4. server_name が合致しない場合
NginxはリクエストのHostヘッダーに一致するserver_nameを持つserverを探すが、見つからない場合はデフォルトのserverが適用される。
デフォルトのserverは以下のいずれかになる。
-
default_serverが指定されているserver - 指定がない場合、設定ファイル内で最初に定義された
server
e.g. default_serverを指定する場合
server {
listen 80 default_server;
...
}
5. server_name _; の挙動
server_name _;はserver_name に該当しないリクエストを処理するための一般的な設定。
「すべてのリクエストを受け入れる」設定ではない。
Hostヘッダーが空の場合にも適用される。
6. server_name_in_redirect
Nginxのserver_nameをリダイレクト時に使うかどうかを制御
e.g. Nginxはリダイレクト時にserver_nameではなくHostヘッダーを使用する
server {
listen 80;
server_name example.com;
server_name_in_redirect off;
}