Nginx中allow/deny实现IP白名单,必须置于location块内、按“先allow后deny all”顺序书写,且deny all须为最后指令;放于http/server顶层无效,代理环境下需配合geo模块还原真实IP并加固安全。

在 Nginx 中用 allow 和 deny 控制 IP 访问,关键不是堆指令,而是顺序、作用域和兜底逻辑。配错顺序或放错位置,白名单就等于没设。
必须写在 location 块里才生效
这两个指令只在 location 块内起作用。放在 http 或 server 顶层块中,Nginx 会忽略——不会报错,但也不生效。
- 想限制后台路径?写在
location /admin/ { ... }里 - 只想放行某类静态资源?写在
location ~ \.js$ { ... }或location /static/ { ... }中 - 控制 API 接口?对应
location /api/v2/ { ... }
顺序决定权限边界:先 allow,后 deny all
规则从上到下逐条匹配,一旦命中就停止判断。所以白名单逻辑必须是“明确放行 → 兜底拒绝”:
- 每条
allow独立一行,支持单 IP(如allow 192.168.5.20;)、IPv4 网段(如allow 10.0.0.0/8;)、IPv6(如allow 2001:db8::/32;) - 允许多个来源?直接追加多行
allow即可 -
deny all;必须放在所有allow之后,且是该location中最后一条访问控制指令 - 漏掉
deny all;,未匹配的请求默认放行,白名单形同虚设
代理环境下要小心真实 IP
如果 Nginx 前面有 CDN、SLB 或反向代理,$remote_addr 是代理 IP,不是用户真实 IP,allow/deny 就会失准。
- 确认上游是否透传
X-Forwarded-For头,且该头内容可信(需在代理层清洗) - 若可信,可用
geo模块提取并判断真实 IP,例如:geo $real_ip_allowed {<br> default 0;<br> 10.20.0.0/16 1;<br> 172.16.100.0/24 1;<br>}
再在location中用if ($real_ip_allowed = 0) { return 403; }
配套加固更稳妥
仅靠 IP 控制不够,建议叠加基础防护:
- 关闭目录浏览:
autoindex off;,防止/static/直接列出文件 - 屏蔽隐藏文件:
location ~ /\. { deny all; },拦截/.git/config等敏感路径 - 限制 HTTP 方法:
limit_except GET HEAD { deny all; },禁止对静态资源发 POST/PUT - 禁用符号链接:
disable_symlinks on;(尤其搭配alias使用),防路径穿越


















