デフォルトのキャッチオールサーバーブロックを設定して、正確な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;
}
私はテストしましたが、それらは同等に動作するようです。それらの間に違いはありますか?
短い答え:はい、server_name "";
とserver_name _;
には違いがあります
長い答え:server_name "";
は、リクエストなしでの一致を定義しますHost
header0.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 /