You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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,产生以下两个疑问:

  1. 明明指定了 alocal、blocal 作为 server_name,为何 Nginx 还会处理 localhost 请求?
  2. 如何配置让 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:30:56