server_name不控制ip访问,必须用allow/deny指令在server或location块中配置;需allow在前、deny all结尾,代理环境须配合set_real_ip_from和real_ip_header还原真实ip。

server_name 本身不控制 IP 访问权限,它只匹配请求头中的 Host 字段(即域名),和客户端 IP 无关。想“只允许特定 IP 访问某个 server 块”,不能靠 server_name 实现,必须用 allow/deny 指令配合作用域控制。
真正有效的做法是:把 IP 限制规则放在 server 或更细粒度的 location 块里,并确保逻辑顺序和上下文正确。
✅ 正确配置方式:在 server 块中用 allow + deny all
适用于整个站点(或该 server 下所有路径)仅对指定 IP 开放:
server {
listen 80;
server_name example.com; # 这行管域名匹配,不影响IP判断
root /var/www/html;
# 所有请求先经过这里做IP校验
allow 203.123.45.67;
allow 192.168.10.0/24;
deny all;
location / {
try_files $uri $uri/ =404;
}
}
⚠️ 注意:
-
allow必须写在deny all之前,顺序不可颠倒; - 这组指令只能出现在
http、server、location块中,不能放在if里; - 若该 server 同时处理多个域名(如泛解析),
server_name不影响 IP 控制逻辑。
✅ 更安全的做法:限制特定路径(推荐)
避免误拦静态资源、健康检查接口或 CDN 回源请求:
server {
listen 80;
server_name example.com;
# 公共资源不限制
location /static/ {
alias /var/www/static/;
}
# 后台接口只允许运维IP
location ^~ /admin/ {
allow 203.123.45.67;
allow 2001:db8::1;
deny all;
proxy_pass http://backend;
}
# API 接口只允许内网调用
location /api/ {
allow 10.0.0.0/8;
deny all;
proxy_pass http://api_backend;
}
}
? 提示:
-
^~表示前缀匹配且优先级最高,适合保护管理路径; - 多个
location可各自独立设白名单,互不影响; - 如果用了 CDN/SLB,需先还原真实 IP(见下文)。
⚠️ 真实 IP 被代理覆盖?必须加 real_ip 配置
云环境常见问题:$remote_addr 是 CDN 节点 IP,不是用户真实 IP。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
需在 http 或 server 块开头添加:
set_real_ip_from 192.168.200.0/24; # 你的可信代理网段(如阿里云SLB、Cloudflare等) set_real_ip_from 2001:db8::/32; real_ip_header X-Forwarded-For; real_ip_recursive on;
然后把 allow 规则中的 $remote_addr 替换为 $realip_remote_addr —— 但注意:allow 指令不支持变量,所以实际要用 geo 指令预判:
geo $realip_remote_addr $is_trusted {
default 0;
203.123.45.67 1;
192.168.10.0/24 1;
}
server {
...
if ($is_trusted = 0) {
return 403;
}
}
❌ 常见错误写法(不会生效)
-
把
allow/deny写在if块里:if ($host = "example.com") { allow 1.2.3.4; # ← 无效!Nginx 忽略此行 deny all; } -
在
location外写了allow,但没加deny all:server { allow 1.2.3.4; # ← 没有 deny all,其余 IP 默认仍可访问 location / { ... } } -
忘了 reload 配置:
nginx -t && nginx -s reload
不复杂但容易忽略










