如何让Nginx仅处理指定主机(alocal、blocal),拒绝裸IP/localhost请求?
Nginx 配置疑问解答
问题背景
本地配置了两条 Nginx 虚拟主机规则:
server_name alocal; listen 80; location / { ... proxy_pass http://localhost:8081; }
和
server_name blocal; listen 80; location / { ... proxy_pass http://localhost:8082; }
同时修改了 Windows 的 hosts 文件:
C:\Windows\System32\Drivers\etc\hosts 127.0.0.1 alocal 127.0.0.1 blocal
访问 http://alocal 和 http://blocal 时能正确转发到对应端口,但访问 http://localhost 时,Nginx 会按第一条规则转发到 8081,产生以下两个疑问:
- 明明指定了
alocal、blocal作为server_name,为何 Nginx 还会处理localhost请求? - 如何配置让 Nginx 仅处理
alocal、blocal,拒绝裸 IP 地址的请求?
解答
疑问1解答
Nginx 处理请求时,若请求的 Host 头未匹配到任何 server 块的 server_name,会启用默认虚拟主机处理。默认主机的判定规则是:
- 当多个
server块监听同一端口时,第一个被加载的server会成为默认主机; - 未显式指定默认主机时,第一个符合监听端口的
server自动被选中。
访问 http://localhost 时,请求的 Host 头为 localhost,与已配置的两个 server_name 均不匹配,因此 Nginx 会调用第一个加载的 server(即配置 alocal 的那个)处理请求,最终转发到 8081。
疑问2解答
要让 Nginx 仅处理 alocal 和 blocal 的请求,同时拒绝裸 IP(如 127.0.0.1、localhost 或其他未配置域名)的请求,可添加一个默认拒绝的 server 块,并将其设为默认虚拟主机,配置如下:
# 默认拒绝的 server,需放在所有 server 块最前面 listen 80 default_server; server_name _; # 匹配所有未被其他 server 匹配的 Host 头 location / { return 444; # 直接关闭连接,不返回响应 # 也可返回 403 提示:return 403 "Forbidden"; } # 业务 server 块 server { server_name alocal; listen 80; location / { ... proxy_pass http://localhost:8081; } } server { server_name blocal; listen 80; location / { ... proxy_pass http://localhost:8082; } }
关键说明:
default_server标记将该server设为 80 端口的默认主机,所有未匹配其他server_name的请求都会进入此块;server_name _是 Nginx 的特殊值,用于匹配所有无法匹配其他server_name的请求;return 444直接关闭连接,比返回 403 更隐蔽,可根据需求替换为 403 状态码及提示信息。
配置完成后,仅 alocal 和 blocal 的请求会被正常转发,其他未配置的请求都会被拒绝处理。
内容的提问来源于stack exchange,提问作者Santa Monica
相关产品推荐
相关产品推荐

