Nginx API 接口需在 location 块中按序配置 allow/deny all,用 ^~ 提升优先级,启用 real_ip_module 并设 set_real_ip_from 与 real_ip_header 以识别真实客户端 IP;多规则宜用 include 或 geo 模块管理。

直接在对应 API 接口的 location 块里配 allow 和 deny all,顺序不能错,还要确保识别的是真实客户端 IP。
按接口路径单独配置白名单
不同 API 路径可应用不同访问策略。比如管理类接口只给运维网段,导出接口只放行 BI 服务器:
location /api/v1/admin/ { allow 172.16.20.0/24; deny all; proxy_pass http://backend; }location /api/v1/export/ { allow 10.5.100.50; allow 10.5.100.51; deny all; proxy_pass http://backend; }- 用
^~前缀提升匹配优先级,避免被正则规则覆盖 - 不要把规则写在
http或server顶层,必须落在具体location内才生效
确保识别真实客户端 IP
如果前端有 CDN、负载均衡或反向代理,$remote_addr 默认是上游地址,不是用户真实 IP:
- 启用
real_ip_module模块(Nginx 通常已内置) - 配置
set_real_ip_from指定可信上游 IP 段 - 设置
real_ip_header X-Forwarded-For;或X-Real-IP - 之后
allow判断才基于真实来源 IP 生效
多 IP 或动态规则的实用做法
规则较多或需频繁更新时,不建议硬编码在配置中:
- 用
include引入外部文件,例如include /etc/nginx/conf.d/api-whitelist.conf; - 用
geo模块预定义变量,再配合if返回 403,适合跨多个 location 复用 - 复杂鉴权场景(如结合 token 或账号体系),可用
auth_request转发到内部校验服务
关键细节别踩坑
看似简单,但几处容易出错:
-
deny all必须放在所有allow之后,且不能省略 - 规则按顺序逐条匹配,命中即停,顺序颠倒会导致全放行或全拦截
- IPv6 地址要写方括号,如
allow [2001:db8::1]; - 修改后务必运行
nginx -t检查语法,再nginx -s reload生效


















