网站上线后,不少人发现自己的图片、压缩包或视频文件被别的站点直接通过URL引用,不仅没带来流量,反而占用了服务器带宽。Nginx作为最常用的反向代理和静态资源服务器,自带了轻量的防盗链能力,合理配置就能拦截大部分盗用请求。防盗链的本质是判断请求从哪里来,如果不是允许的页面,就拒绝返回真实文件。

基于referer的基础防盗链配置
Nginx通过ngx_http_referer_module模块提供防盗链功能,核心指令是valid_referers。该指令用来定义合法的来源地址,后续用内置变量$invalid_referer判断请求是否合法。当来源不在允许列表时,这个变量会被设为空字符串以外的真值,我们可以在location中根据它返回403或者重定向到提示图。
下面是一段最典型的图片防盗链配置,只允许本站和百度搜索引擎抓取,其他外站引用直接返回403。注意none表示允许无referer的请求,比如用户直接在浏览器打开图片地址;blocked表示允许referer头存在但被防火墙删除了协议的请求。如果确定图片只会被网页嵌入,可以去掉none以更严格。
server {
listen 80;
server_name www.ippipp.com;
location ~* .(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked www.ippipp.com *.ippipp.com;
if ($invalid_referer) {
return 403;
}
root /data/www;
}
}
这种写法的优点是简单、不依赖后端程序,所有判断在Nginx层完成,性能损耗极低。缺点在于referer本身由浏览器发送,可以被伪造,所以对安全要求极高的场景不能只靠它。另外,如果站点启用了CDN,需把CDN的回源域名或节点IP对应的域名也加入白名单,否则正常用户会看到403。
通配符、正则与多规则组合写法
实际业务中往往要同时保护多种资源,并且允许子域名或第三方合作站引用。valid_referers支持字符串、通配符和正则三种形式。字符串精确匹配域名;*通配符可放在开头或结尾;以~开头的部分会被当作正则表达式处理,方便批量放行特定后缀的域名。
下面示例展示了视频和压缩包文件的防盗链,并且用正则放行了所有以cdn-开头的企业内网域名,同时拒绝外站。正则写法要注意转义点号,避免匹配到任意字符。如果合作方较多,建议把白名单抽成单独文件用include引入,方便运维修改而不动主配置。
location ~* .(mp4|zip|rar)$ {
valid_referers
none blocked
www.ippipp.com
*.ippipp.com
~^https?://cdn-[a-z0-9]+.ippipp.com/;
if ($invalid_referer) {
return 403;
}
root /data/files;
}
除了返回403,也可以把盗链请求重写到一张水印图或提示页,既保留可用性又起到警示作用。例如用rewrite跳转到/static/steal.png。不过重写会增加一次内部跳转,高并发下不如直接return高效。多规则组合时,要把最宽松的条件放后面,Nginx按顺序匹配,命中即停止。
增强防护:签名URL与限速策略
referer校验容易被绕过,更可靠的做法是给资源链接加上时效性签名。可以使用ngx_http_secure_link_module模块,在后端生成带md5和过期时间的URL,Nginx验证签名合法且未过期才放行。这样即使别人拿到地址,过一段时间也会失效,从根本上防止长期盗用。
以下配置启用了secure link,请求必须携带?md5=xxx&expires=yyy参数。后端可用PHP或Python按相同算法生成,密钥保存在服务器不公开。配合limit_rate还能给未带签名的预览流量限速,进一步降低被盗链时的损失。
location /download/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "secret$uri$arg_expires";
if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; }
limit_rate 100k;
root /data/secure;
}
在防盗链体系中,建议将referer校验作为第一道低成本防线,签名URL作为核心资源的最终防线。同时可在响应头中设置Content-Disposition和跨域限制,避免文件被嵌入到别的网页中播放或下载。定期分析访问日志中referer字段的异常域名,能及时发现新的盗链站点并加入黑名单,形成动态防护闭环。