nginx 的 default_server 指令可以定義預設的 server 出處理一些沒有成功比對 server_name 的請求,如果沒有顯式定義,則會選取第一個定義的 server 作為 default_server。
在了解到如上規則後,我們可以捕獲未做綁定的域名通路或直接IP通路,做重定向到403頁面等處理。
1、nginx 隐式的 default server
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 回收處理。
2、顯示的定義一個 default 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
}
}
3、直接指定server_name 為 ip(隻能禁止ip通路)
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
}
}