禁止单个ip访问
# 禁止某IP访问if ($remote_addr = "192.168.1.100") {
return 403;
}
针对多 IP 禁止访问,我给你提供 3 种常用方案,全部实测可用,按需选择即可:
✅ 方法一:推荐写法 deny ip地址; (最简单、最高效,优先用)
这是 Nginx 官方最推荐的禁止 IP 语法,性能最好,写法最简单,专门用于黑白名单场景,支持单个 IP / 多个 IP/IP 段,可以写在 http{}、server{}、location{} 任意层级。
写法示例(禁止多个指定 IP)
nginx
# 写法1:每行写一个,可读性强(推荐)
deny 192.168.1.100;
deny 192.168.1.101;
deny 10.0.0.5;
deny 223.5.5.5;
# 所有未被禁止的IP,允许访问(默认也是允许,可省略,写了更规范)
allow all;
✅ 方法二:保留你原有的 if + $remote_addr 写法(改造成多 IP 匹配)
如果你想沿用你原来的 if 判断写法,不需要改语法习惯,只需要把判断符从等于= 改成 正则匹配~ 即可,完美兼容你的原有代码,推荐简单多 IP 场景使用。
核心语法说明
- 单 IP 判断:
$remote_addr = "xxx.xxx.xxx.xxx"【精准匹配】 - 多 IP 判断:
$remote_addr ~ ^(IP1|IP2|IP3)$【正则精准匹配多个 IP】
改造后的完整代码(你的需求完美适配)
nginx
# 禁止 192.168.1.100、192.168.1.101、10.0.0.5 这3个IP访问,返回403
if ($remote_addr ~ ^(192.168.1.100|192.168.1.101|10.0.0.5)$) {
return 403;
}
✔ 补充正则规则(必看,避免踩坑)
^表示「开头」,$表示「结尾」,加上这两个符号是精准匹配 IP,防止出现匹配到192.168.1.1000这类错误 IP 的情况- 多个 IP 之间用英文竖线
|分隔,注意没有空格 - 符号都是英文符号,不要用中文符号
✅ 方法三:批量禁止(适用【超多 IP/IP 段】场景)
如果需要禁止的 IP数量非常多(几十上百个) ,或者需要禁止整个 IP 段,推荐用这个方案,性能最优,维护最方便,分两种场景:场景 3.1 禁止【多个 IP 段】(推荐)
比如禁止整个局域网段、某个地区的 IP 段,用deny 网段/掩码 语法:nginx
# 禁止 192.168.1.0-192.168.1.255 整个网段
deny 192.168.1.0/24;
# 禁止 10.0.0.0-10.255.255.255 整个网段
deny 10.0.0.0/8;
# 允许其他所有IP访问
allow all;
场景 3.2 禁止【海量独立 IP】(企业级用法)
- 在 Nginx 配置目录新建一个黑名单文件,比如
ip_blacklist.conf
bash
运行vi /usr/local/nginx/conf/ip_blacklist.conf - 在文件里一行一个 IP,写入所有要禁止的 IP
nginxdeny 192.168.1.100; deny 192.168.1.101; deny 10.0.0.5; deny 223.5.5.5; deny 114.114.114.114; - 在你的 Nginx 主配置文件
nginx.conf的http{}或server{}里引入这个文件即可
nginxinclude ip_blacklist.conf; allow all;
✨ 额外补充 2 个实用知识点(必看)
1. 禁止 IP 后,除了返回 403,还可以做什么?
你原来的return 403; 是「拒绝访问」,浏览器会显示 403 错误页,还可以配置其他返回规则,按需修改:nginx
# 方案1:返回403禁止访问(最常用,推荐)
return 403;
# 方案2:直接拒绝连接,不返回任何内容(更彻底)
return 444;
# 方案3:跳转到指定的提示页面/官网
return 302 https://www.xxx.com/forbidden.html;
2. 配置修改后,如何生效?
所有 Nginx 配置修改后,不需要重启服务,执行「平滑重载」命令即可,服务不中断,零影响:bash
运行
# 先检查配置是否有语法错误(必须做)
nginx -t
# 无错误后,平滑重载配置(生效)
nginx -s reload
声明:本文网友投稿,观点仅代表作者本人,不代表鲁班SEO赞同其观点或证实其描述。
声明:本文网友投稿,观点仅代表作者本人,不代表鲁班SEO赞同其观点或证实其描述。
