如何在NGINX中同时仅允许指定域名与指定IP访问
实现方案
该需求可直接通过NGINX自带的访问控制、Host头校验能力实现,无需额外安装第三方模块,具体配置如下:
场景1:满足「来源为指定IP」或「访问指定域名」任一条件即可放行
http { # 定义允许放行的来源IP白名单,支持单个IP或IP段 geo $allowed_ip { default 0; 192.168.1.100/32 1; 10.0.0.0/24 1; } # 定义允许放行的访问域名白名单 map $host $allowed_host { default 0; example.com 1; www.example.com 1; } server { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl default_server; listen [::]:443 ssl default_server; # 配置默认服务块的SSL证书,避免HTTPS请求握手报错 ssl_certificate /path/to/default/cert.pem; ssl_certificate_key /path/to/default/cert.key; # 访问校验逻辑 set $block 0; if ($allowed_ip = 0) { set $block "${block}1"; } if ($allowed_host = 0) { set $block "${block}2"; } # 既不在IP白名单也不在域名白名单的请求直接返回444断开连接 if ($block = 012) { return 444; } # 下方填写正常的站点配置 # root /path/to/webroot; # index index.html index.htm; } }
场景2:必须同时满足「来源为指定IP+访问指定域名」才可放行
将上述校验逻辑替换为以下内容即可:
if ($allowed_ip = 0) { return 444; } if ($allowed_host = 0) { return 444; }
生效说明
- 配置修改后先执行
nginx -t校验语法是否正确,确认返回test is successful后再执行nginx -s reload生效 - 必须配置
default_server默认服务块,确保所有未绑定域名、泛解析的请求都会进入校验逻辑 - 若存在多个站点服务块,可将校验逻辑抽为独立的
access_check.conf文件,在每个server块内通过include /path/to/access_check.conf引入即可,无需重复编写配置
内容的提问来源于stack exchange,提问作者Paul Townsend
相关产品推荐
相关产品推荐

