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;
}