NGINX 域名及IP白名单拦截,Referer防盗链设置

本文详细介绍了如何通过NGINX配置实现域名和IP白名单拦截非法请求,以及利用Referer防盗链保护资源安全。内容包括四种方法:主机名正则匹配、default_server定义、Referer防盗链模块以及白名单和防盗链的组合限制,通过实例展示了配置效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        针对线上对外NGINX代理服务安全非常重要,接下来针对域名IP白名单配置来拦截非法请求,同时通过Referer防盗链设置判断该请求是否为合法请求,具体看本文测试操作结果。

方式一:通过http_Host来源判断主机名正则匹配:

         server_name   www.test.com 172.17.80.104;

        if ($http_Host !~* ^www.test.com|172.17.80.104$)

        {

            return 500;

        }

域名和IP都可以访问:

        

        

IP172.17.80.104访问失败

server_name   www.test.com;

        if ($http_Host !~* ^www.test.com$)

    &nbs

<think>嗯,用户之前问过关于Nginx定制访问日志格式的问题,现在他们接着问防盗链设置。看来用户可能是在搭建网站或者管理服务器,需要保护自己的资源不被盗用。防盗链通常是指防止其他网站直接链接到你的图片、视频等静态资源,这样会消耗你的带宽和服务器资源。 首先,我要回忆一下Nginx防盗链的常见方法。通常是通过检查HTTP请求头中的Referer字段,来判断请求是否来自合法的域名。如果Referer不在白名单里,就拒绝访问或者返回错误码。另外,可能还可以使用签名的方式,比如通过生成带有时间戳和签名的URL,来确保只有授权的请求才能访问资源。 用户可能已经知道一些基础,但需要详细的步骤和配置示例。需要分步骤说明,比如如何配置valid_referers,如何处理无效的Referer,可能还需要提到安全链(Secure Link)模块的使用。 另外,考虑到用户之前定制过日志,可能他们也在意如何记录防盗链的访问情况,可能需要结合日志格式来记录相关变量,比如$http_referer或者$invalid_referer。 还需要注意一些常见问题,比如如果网站有移动端或者API请求,Referer可能为空,这时候需要特别处理,允许空的Referer或者特定的来源。此外,防盗链配置可能会影响SEO或者CDN的使用,需要提醒用户注意配置的合理性和测试的重要性。 可能用户的需求不仅仅是基本的防盗链,他们可能还想了解更高级的方法,比如使用第三方模块或者结合Lua脚本进行更复杂的验证。但作为基础,应该先介绍标准的Referer检查和Secure Link模块。 最后,需要确保配置的正确性,比如Nginx的模块是否已经包含http_referer_module和secure_link_module,这些模块通常默认编译进去,但可能需要确认。同时,提供配置示例和测试方法,让用户能够验证防盗链是否生效。</think>以下是Nginx防盗链配置的详细说明: --- ### 一、防盗链核心原理 通过验证`Referer`请求头,判断资源请求是否来自合法域名。若未通过验证,可拦截请求或返回错误响应。 --- ### 二、基础配置:`valid_referers`指令 ```nginx location ~* \.(jpg|png|gif|mp4)$ { # 匹配需要保护的资源类型 valid_referers none blocked server_names *.example.com ~\.google\.; if ($invalid_referer) { # 验证不通过时处理 return 403; # 或返回占位图:rewrite ^ /anti-hotlink.png; } } ``` #### 参数说明: | 参数 | 作用 | |------------------|----------------------------------------------------------------------| | `none` | 允许空Referer(直接访问或浏览器隐私模式) | | `blocked` | 允许被防火墙/代理修改过的Referer | | `server_names` | 允许本服务器域名 | | `*.example.com` | 泛域名匹配 | | `~\.google\.` | 正则表达式匹配(此处示例允许Google域名) | --- ### 三、进阶防盗链方案 #### 方案1:动态资源签名(Secure Link模块) 需Nginx编译时包含`--with-http_secure_link_module` ```nginx location /protected/ { secure_link $arg_md5,$arg_expires; # 从URL参数获取签名和时间戳 secure_link_md5 "$secure_link_expires$uri$remote_addr secret_key"; # 生成签名的密钥公式 if ($secure_link = "") { # 签名验证失败 return 403; } if ($secure_link = "0") { # 签名过期 return 410; } } ``` **资源URL生成示例**(需后端程序配合): ```python expires = int(time.time()) + 3600 # 1小时后过期 signature = hashlib.md5(f"{expires}/video.mp4127.0.0.1 secret_key".encode()).hexdigest() url = f"https://example.com/protected/video.mp4?md5={signature}&expires={expires}" ``` #### 方案2:结合Cookie验证 ```nginx location /media/ { if ($http_referer !~* "^https://(www\.)?example.com/") { set $deny_hotlink 1; } if ($cookie_authtoken != "VaLiDToKeN") { # 校验特殊cookie set $deny_hotlink "${deny_hotlink}1"; } if ($deny_hotlink = 11) { return 403; } } ``` --- ### 四、特殊场景处理 #### 1. 允许移动端APP访问 ```nginx map $http_user_agent $allow_empty_referer { ~*(Android|iOS) 1; # 对移动端UA放宽空Referer限制 default 0; } location /images/ { valid_referers blocked server_names; if ($invalid_referer = 1) { if ($allow_empty_referer = 0) { return 403; } } } ``` #### 2. CDN友好配置 ```nginx valid_referers none blocked server_names *.example-cdn.com # CDN域名 ~\.baidu\.; # 搜索引擎爬虫 ``` --- ### 五、日志记录与监控 在`log_format`中添加防盗链相关变量: ```nginx log_format anti_hotlog '$remote_addr - $http_referer - $invalid_referer - "$request"'; access_log /var/log/nginx/hotlink.log anti_hotlog; ``` --- ### 六、压力测试与验证 1. **测试工具**: ```bash # 模拟非法Referer请求 curl -I -H "Referer: http://pirate.com" http://example.com/image.jpg # 查看日志验证拦截 tail -f /var/log/nginx/hotlink.log ``` 2. **性能优化**: ```nginx location ~* \.(jpg|png)$ { valid_referers ...; if ($invalid_referer) { access_log off; # 拦截请求不记录日志 return 403; } } ``` --- ### 七、注意事项 1. **Referer欺骗**:可通过伪造请求头绕过,需结合其他验证方式 2. **SEO影响**:确保搜索引擎爬虫在允许列表中 3. **缓存控制**:配合`Cache-Control`头防止代理缓存非法资源 通过组合多种验证方式,可实现多层次防盗链防护体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值