nginx中实现“白名单ip免密、其他ip需密码”须用satisfy any:先配置allow指定可信ip(如192.168.1.0/24、203.0.113.5),后接deny all兜底;再同级启用auth_basic与auth_basic_user_file,且所有指令必须共存于同一location块内。

Nginx 的 HTTP 基本认证(auth_basic)和 IP 访问控制(allow/deny)默认是“或”关系:满足任一条件就放行。要实现真正意义上的混合认证逻辑——比如「仅白名单 IP 免密,其余 IP 必须输密码」或「IP 和密码二者缺一不可」——关键就在 satisfy 指令的显式配置。
明确你要的逻辑类型
先确认目标场景,再选 satisfy 值:
- satisfy any:适用于「白名单 IP 免密,其他 IP 需密码」——IP 允许 或 密码正确,任一成立即通过
- satisfy all:适用于「必须同时满足 IP 白名单 + 正确密码」——双因子强制校验,缺一不可
satisfy any:白名单免密,其余需认证
这是最常用、也最符合运维直觉的配置。核心是让 IP 白名单和密码认证成为两条并行的“通关路径”:
- 在同一个
location块中,同时写入allow、deny all和auth_basic指令 - 显式添加
satisfy any;(不能依赖默认,因为某些旧版本或嵌套上下文可能行为不一致) -
deny all;必须放在所有allow之后,否则前面的allow不生效
示例(/admin/ 路径):
location /admin/ {
satisfy any;
allow 192.168.1.0/24;
allow 203.0.113.5;
deny all;
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
satisfy all:IP + 密码双重强制校验
这种模式常用于高敏感接口,要求访问者既来自可信网络,又通过身份核验:
- 同样在
location中配置allow/deny和auth_basic - 显式写
satisfy all;,告诉 Nginx 所有启用的访问控制模块都必须通过 -
deny all;仍不可少——它是satisfy all生效的前提;若无deny,Nginx 可能退化为无条件放行
示例(仅允许内网某段且输入指定账号才能访问):
location /api/internal/ {
satisfy all;
allow 10.0.5.0/24;
deny all;
auth_basic "Internal API";
auth_basic_user_file /etc/nginx/.htpasswd;
}
配套要点不能漏
无论用哪种 satisfy,以下细节直接影响成败:
- 所有指令(
allow、deny、auth_basic、satisfy)必须在同一location块内,不能分散在不同层级 - 密码文件用
htpasswd生成,推荐-B(bcrypt)或-C(crypt)选项,避免弱加密格式 - 确保
.htpasswd文件权限为640,且由 Nginx 工作进程用户(如www-data或nginx)可读 - 修改配置后务必执行
nginx -t测试语法,再nginx -s reload











