web-dev-qa-db-ja.com

Nginxのserver_name _とserver_name ""の違いは何ですか?

デフォルトのキャッチオールサーバーブロックを設定して、正確なserver_name値と一致しないホスト名を処理したいと思います。しかし、どちらを使用すればよいかわかりません。

server {
    listen 80 default_server;
    server_name ""; # this is by default if no server_name specified
    return 444;
}

または

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

私はテストしましたが、それらは同等に動作するようです。それらの間に違いはありますか?

8
NARKOZ

短い答え:はい、server_name "";server_name _;には違いがあります

長い答え:server_name "";は、リクエストなしでの一致を定義しますHostheader0.8.48以降、0.7.12以降でサポートされています。

https://nginx.org/en/docs/http/request_processing.html

「Host」ヘッダーフィールドのないリクエストを許可しない場合は、リクエストをドロップするだけのサーバーを定義できます。

server {
    listen      80;
    server_name "";
    return      444;
}

ここでは、サーバー名は空の文字列に設定され、「Host」ヘッダーフィールドのないリクエストに一致します。接続を閉じる特別なnginxの非標準コード444が返されます。

一方、server_name _;は、実際の名前と交差しない無効なサーバー名を定義します。それは単なる不一致です。したがって、一致しない場合、nginxは最初のserver {}ブロックを選択してそれを使用します。

結論として、server_name _;をキャッチオールサーバーブロックに使用できますが、server_name "";は使用できません。

リファレンス- https://stackoverflow.com/questions/9454764/nginx-server-name-wildcard-or-catch-allhttps://blog.gahooa.com/2013/ 08/21/nginx-how-to-specify-a-default-server /

12
Pramod Singh