优秀的编程知识分享平台

网站首页 > 技术文章 正文

如何限制访问域名之外的请求都禁止访问,包括域名对应的ip

nanyue 2025-09-09 07:52:23 技术文章 2 ℃

在 Nginx 中,default_server 是一个监听指令(listen directive)的参数,用于指定某个 server 块作为 默认的虚拟主机,处理所有未明确匹配 server_name 的请求(比如直接通过 IP 访问或未知域名)。


default_server的定义位置

default_server 是在 listen 指令中定义的,例如:

nginx

listen 443 ssl default_server;      # IPv4
listen [::]:443 ssl default_server; # IPv6
  • 这个配置告诉 Nginx:
    • “如果请求的 Host 头不匹配任何 server_name,就由这个 server 块处理”
    • 如果没有 default_server,Nginx 会使用 第一个定义的 server 作为默认(不推荐依赖隐式行为)。

你的配置解析

nginx

server {
    listen 443 ssl default_server;       # 定义此块为 HTTPS 默认处理
    listen [::]:443 ssl default_server;  # IPv6 同理
    server_name _;                       # 匹配任意未定义的域名
    return 444;                          # 直接断开连接
    ssl_certificate /path/to/dummy.crt;  # 必须的证书(即使无用)
    ssl_certificate_key /path/to/dummy.key;
}
  • 作用:当用户直接访问 https://ip 时:
    • 请求的 Host 头是 IP 地址,无法匹配其他 server 块的 server_name
    • 因此,Nginx 会使用这个 default_server 块处理,执行 return 444(强制关闭连接,不返回内容)。

关键注意事项

  1. 唯一性
  2. 每个端口(如 443、80)只能有一个 default_server。如果重复定义,Nginx 会使用最后一个加载的配置。
  3. 检查是否有其他 server 块也定义了 default_server(冲突会导致意外行为)。
  4. SSL 证书必须存在
  5. 即使 default_server 仅用于拒绝访问,HTTPS 也必须配置证书(可自签名)。
  6. 生成自签名证书:
  7. bash
  8. openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/dummy.key \ -out /etc/nginx/dummy.crt \ -subj "/CN=localhost"
  9. 测试配置
  10. 检查语法:sudo nginx -t
  11. 重载 Nginx:sudo systemctl reload nginx
  12. 测试访问:
  13. bash
  14. curl -I https://ip # 应返回无响应或错误 curl -I https://域名 # 应正常返回内容

如果仍然不生效

  1. 确保没有其他 server 块覆盖了 default_server
  2. 检查 Nginx 是否加载了正确的配置文件(可能有多文件包含顺序问题)。
  3. 使用 nginx -T 查看完整配置,确认 default_server 是否正确绑定。

Tags:

最近发表
标签列表