nginx+lua实现视频的过期防盗链

该博客介绍了如何利用Nginx的Lua模块来实现视频链接的过期防盗链功能。通过设置干扰码$salt$和过期时间$expire$,当用户请求匹配.mp4$的URL时,会检查MD5加密串是否等于$salt$与当前或前后一小时时间的组合。如果匹配,允许播放,否则返回404或403错误。这种方法提高了视频的安全性和可控性。

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

set $salt "mysalt"; #设置的干扰码
set $expire "3";    #设置的过期时间,默认为3小时
location ~* \.mp4$ {
        rewrite_by_lua '
        local md5str,path = string.match(ngx.var.uri,"^/(%w+)(/%S+)")  #提取url地址中的md5加密串和视频的真实地址
        if string.len(md5str) ~= 32 or string.len(md5str) == nil then
                ngx.exit(404)
        end  #如果加密串长度不为32或者是为空,这报404错误

        local ur = 0 #设置变量ur,用于定位是否视频是否为合法的访问
        local time = tonumber(os.date("%y%m%d%H")) #去系统时间到小时
        if md5str == ngx.md5(ngx.var.salt..time) then # 如果md5加密串是干扰码和当前时间的值相等,这返回真实的视频地址
                --ngx.say("ngx.var.salt..time : ",ngx.var.salt..time," : ",ngx.md5(ngx.var.salt..time))
                ngx.req.set_uri(path)
                ur = ur + 1
                --ngx.say(path)
        else 否则的话进入判断查看是否为过期的视频
                local i = 1 #引入变量i,用于循环判断
     
<think>好的,用户想了解如何配置Nginx实现防盗链的最佳实践。首先,我得回忆一下防盗链的基本原理。防盗链主要是防止其他网站直接链接到自己的资源,比如图片、视频等,这样会消耗自己的带宽。通常的做法是检查HTTP请求头中的Referer字段,判断请求来源是否合法。 接下来,我需要考虑Nginx中如何配置。记得Nginx的ngx_http_referer_module模块提供了防盗链的功能。配置应该在server或location块中使用valid_referers指令来指定合法的来源。比如,允许空Referer(直接访问)和自家域名。然后通过$invalid_referer变量判断是否无效,如果是,返回403或者重定向。 然后,用户提到最佳实践,可能需要更详细的步骤。比如,如何设置白名单,如何处理静态资源,是否需要使用错误图片替代盗链请求。另外,可能还要考虑使用secure_link模块加强安全性,或者用Lua脚本动态处理,但用户的问题可能更关注基本配置。 还要注意引用中的信息,比如引用[3]提到的动态DNS解析可能和防盗链无关,但引用[4]提到使用Lua实现资源合并,可能防盗链也可以结合Lua做更复杂的逻辑,不过用户可能只需要基础方法。 然后,需要验证配置的正确性。比如,测试不同的Referer情况,确保合法访问通过,非法被拒绝。还要考虑浏览器直接访问(无Referer)的情况,是否需要允许,比如内链图片可能允许空Referer。 另外,可能提到添加rewrite规则来重写盗链请求,比如返回一个错误图片。同时,注意配置缓存和性能影响,确保防盗链不会显著影响服务器性能。 最后,总结步骤,分点说明,确保结构清晰。可能还要提醒用户根据实际需求调整,比如允许某些合作伙伴的域名,或者使用正则表达式匹配多个子域名。</think>### Nginx防盗链配置最佳实践 **1. 基础防盗链配置** 通过`valid_referers`指令验证请求来源,在`server`或`location`块中添加: ```nginx location ~* \.(jpg|jpeg|png|gif|mp4)$ { valid_referers none blocked *.yourdomain.com server_names ~\.google\.; if ($invalid_referer) { return 403; # 或返回替代图片: rewrite ^ /anti-hotlink.jpg; } } ``` * `none`: 允许空Referer(直接访问) * `blocked`: 允许非标准Referer(如防火墙过滤后的请求) * 支持域名/正则表达式白名单[^2] **2. 进阶安全增强** ```nginx location /static/ { # 添加资源访问签名 secure_link $arg_md5,$arg_expires; secure_link_md5 "$secure_link_expires$uri$remote_addr secret"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } } ``` 通过时间戳+IP+密钥生成动态签名,实现临时访问链接[^3] **3. 组合防护策略** ```nginx location ~* ^/protected/ { # 第一阶段:基础Referer验证 valid_referers server_names *.trusted.com; # 第二阶段:Lua脚本动态验证 access_by_lua_block { if ngx.var.http_referer == nil then ngx.exit(403) end -- 可查询数据库进行动态验证[^5] } # 第三阶段:设置资源缓存策略 add_header Cache-Control "private"; } ``` **4. 最佳实践要点** - 对静态资源设置`expires`头减少盗链价值 - 使用`map`指令创建多级防盗规则: ```nginx map $http_referer $bad_referer { hostnames; default 0; *.spammer.com 1; ~.xxx. 1; } ``` - 重要资源建议开启HTTPS+防盗链双重防护 - 定期分析日志优化白名单: ```bash awk '{print $11}' access.log | grep -v "-" | sort | uniq -c | sort -nr ``` **5. 测试验证方法** ```bash # 模拟合法访问 curl -I -H "Referer: https://www.yourdomain.com" http://cdn.example.com/image.jpg # 模拟非法访问 curl -I -H "Referer: https://www.pirate.com" http://cdn.example.com/image.jpg ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值