nginx 的 default_server 指令能夠定義默認的 server 出處理一些沒有成功匹配 server_name 的請求,若是沒有顯式定義,則會選取第一個定義的 server 做爲 default_server。nginx
在瞭解到如上規則後,咱們能夠捕獲未作綁定的域名訪問或直接IP訪問,作重定向到403頁面等處理。spa
http { # 若是沒有顯式聲明 default server 則第一個 server 會被隱式的設爲 default server server { listen 80; server_name _; # _ 並非重點 __ 也能夠 ___也能夠 return 403; # 403 forbidden } server { listen 80; server_name www.a.com; ... } server { listen 80; server_name www.b.com; ... } }
不少人複製粘貼普遍傳播 server_name 要設爲 '_',其實一毛錢的關係也沒有。'_' 只是做爲一個和業務域名無關的請求回收服務而已,若是咱們線上的業務都是明確的業務域名訪問,那泛解析形成的一些非業務域名或ip訪問都會被這個 sever 回收處理。code
在沒有顯式定義 default server 時,nginx 會將配置的第一個 server 做爲 default server,即當請求沒有匹配任何 server_name 時,此 server 會處理此請求。因此,當咱們直接使用 ip 訪問時會被交給此處定義的第一個 server 處理,403 forbidden。server
http { server { listen 80; server_name www.a.com; ... } server { listen 80; server_name www.b.com; ... } # 顯示的定義一個 default server server { listen 80 default_server; server_name _; return 403; # 403 forbidden } }
http { server { listen 80; server_name www.a.com; ... } server { listen 80; server_name www.b.com; ... } # 直接指定 ip server_name server { listen 80; server_name xxx.xxx.xxx.xxx; return 403; # 403 forbidden } }
以上三種方式均可禁止 ip 直接訪問,且 1,2 同時能夠禁止未綁定域名的訪問(好比你泛解析了主域名)。排序
小記:nginx 批量載入配置 conf 時會按 ascii 排序載入,這就會以 server_a.conf server_b.conf server_c.conf 的順序載入,若是沒有生命 default_server 的話,那 server_a 會做爲默認的 server 去處理 未綁定域名/ip 的請求。ip