在 Nginx 中实现"仅允许 10.0.0.5、10.0.0.6、10.0.0.8 访问,其他 IP 禁止",核心用 allow(允许)和 deny(禁止)指令,支持 全局、虚拟主机(server 块)、特定路径(location 块) 三种粒度控制,按需选择即可:
一、核心配置语法(基础)
nginx
# 允许指定 IP(多个 IP 分行写)
allow 10.0.0.5;
allow 10.0.0.6;
allow 10.0.0.8;
# 禁止所有其他 IP(必须放在最后,Nginx 按顺序匹配)
deny all;
二、三种常见使用场景(直接复制可用)
场景 1:禁止访问整个网站(server 块级别)
适合限制整个虚拟主机(如 web01.proxy.cn),仅允许 3 个 IP 访问:
nginx
server {
listen 80;
server_name web01.proxy.cn;
root html;
# 关键:IP 白名单配置(放在 server 块最前面)
allow 10.0.0.5;
allow 10.0.0.6;
allow 10.0.0.8;
deny all; # 拒绝其他所有 IP
location / {
index index.html index.htm index.php;
}
# 其他配置(如静态文件、PHP 转发等)...
}
场景 2:禁止访问特定路径(location 块级别)
适合仅限制某个目录/文件(如 /admin 后台、/api 接口),网站其他部分正常开放:
nginx
server {
listen 80;
server_name web01.proxy.cn;
root html;
location / {
index index.html index.htm index.php;
}
# 关键:仅限制 /admin 路径,仅允许 3 个 IP 访问
location /admin/ {
allow 10.0.0.5;
allow 10.0.0.6;
allow 10.0.0.8;
deny all;
# 若该路径是 PHP 项目,需保留原有转发配置
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 其他配置...
}
场景 3:禁止访问特定文件(如单个接口文件)
适合仅限制某个文件(如 /api/data.php),其他文件正常访问:
nginx
server {
listen 80;
server_name web01.proxy.cn;
root html;
location / {
index index.html index.htm index.php;
}
# 关键:仅限制 /api/data.php 文件
location = /api/data.php {
allow 10.0.0.5;
allow 10.0.0.6;
allow 10.0.0.8;
deny all;
# PHP 转发配置(按需保留)
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 其他配置...
}
三、关键注意事项(避免踩坑)
-
匹配顺序 :
allow必须放在deny all前面!Nginx 按配置顺序匹配,一旦匹配到allow就放行,否则执行最后deny all; -
IP 格式支持 :
- 单个 IP:
allow 10.0.0.5;(你要的场景); - 网段:
allow 10.0.0.0/24;(允许 10.0.0.0-255 网段); - 子网掩码:
allow 10.0.0.0/255.255.255.0;(和网段等价);
- 单个 IP:
-
禁止后的响应 :默认返回
403 Forbidden(禁止访问),若想自定义提示页面,可添加:nginxerror_page 403 /403.html; # 403 时跳转自定义页面 location = /403.html { root html; # 自定义页面放在 nginx 的 html 目录 } -
配置生效 :修改后必须重载 Nginx:
bash/usr/local/nginx/sbin/nginx -t # 先检查语法是否正确 /usr/local/nginx/sbin/nginx -s reload # 重载配置
四、验证是否生效
用非白名单 IP(如 10.0.0.9)访问,会返回 403;用 10.0.0.5/6/8 访问,正常放行。也可通过 curl 测试:
bash
# 用非白名单 IP 测试(假设服务器是 10.0.0.7)
curl -I http://10.0.0.7 # 应返回 403 Forbidden
总结
按你的需求,优先选择「场景 1(server 块级别)」,直接在目标虚拟主机中添加 allow 和 deny all,即可实现"仅 3 个 IP 访问,其他禁止"。如果只需限制部分路径/文件,选场景 2 或 3 即可。