独立站Nginx防盗链,防止图片、静态资源被盗刷流量
独立站只要图片、CSS、JS 等静态资源被其他网站直接引用,就会白白消耗源站带宽。
Nginx 防盗链通过校验访客来源(Referer)拦截非法请求,是性价比最高、也最容易落地的防护手段。
本文从零开始,演示独立站 Nginx 防盗链的完整配置步骤,并说明空 Referer、伪造 Referer 等情况怎么处理,配置完成后可以用命令快速验证是否生效。
先搞清楚防盗链能挡住什么
Nginx 的 valid_referers 指令可以检查 HTTP 请求头里的来源域名。
只有来源域名在允许列表里的请求,才能正常加载图片或静态文件,其他来源一律返回 403。
这套方案适合以下场景:
- 图片被其他网站直接用链接引用,导致源站流量上涨。
- 静态资源被采集站批量调用,占用服务器带宽。
- 不希望第三方站点将你的图片当作自己的资源展示。
这里顺手提醒一下,Referer 由浏览器主动发送,理论上可以被伪造,所以防盗链只防普通盗链,不防恶意攻击。
要彻底防刷,还需要配合 CDN、访问频率限制或对象存储的签名鉴权。
配置前需要准备什么
操作前确认两件事:
- 你用的是 Linux 服务器,且 Nginx 已经安装并能正常访问网站。
- 你能通过 SSH 登录服务器,或者在宝塔面板中能修改 Nginx 配置文件。
如果用的是宝塔面板,不需要直接编辑 /etc/nginx/nginx.conf,只需在对应站点的配置文件中添加规则,保存后重载 Nginx 即可。
Nginx 防盗链配置完整步骤
先看一个最常用的配置,把它放到 server 块内,或放到静态资源对应的 location 块中。
location ~ \.(gif|jpg|jpeg|png|webp|bmp|svg|css|js)$ {
valid_referers none blocked \
server_names \
*.example.com example.com;
if ($invalid_referer) {
return 403;
}
expires 30d;
}
这里各行的作用:
valid_referers:指定允许的 Referer 来源。none表示允许空 Referer;blocked表示允许被防火墙或代理删除 Referer 的请求;*.example.com example.com表示你自己的主域名和所有子域名。$invalid_referer:Nginx 在请求来源不在列表内时自动赋予的变量,值为 1。return 403:拦截非法盗链请求,不返回图片内容。expires 30d:给合法请求设置浏览器缓存,减少源站压力。
修改配置文件后,先测试语法:
nginx -t
输出 syntax is ok 后,再重载 Nginx:
nginx -s reload
如果用的是宝塔面板,操作路径是:网站 → 找到站点 → 设置 → 配置文件,在 server 块内合适位置粘贴上述规则,保存后点击“重载配置”。
这三个坑最容易导致防盗链失效
只配置图片不配置 CSS/JS。
很多盗链者会把整个页面的静态资源一起引用,有些教程只写图片后缀,导致 CSS、JS 仍被刷。
建议把常见静态资源后缀都加进去,或者直接写成 location ~ \.(gif|jpg|jpeg|png|webp|bmp|svg|css|js|woff|ttf|mp4|zip)$。
空 Referer 被误杀。
用户直接输入图片 URL、从收藏夹访问、或某些浏览器隐私模式下,自动请求可能不带 Referer。
前面配置里的 none blocked 就是允许这种情况,如果你把这两项去掉,会造成部分用户图片打不开。
使用 if 指令时位置不对。if ($invalid_referer) 在 location 块内是推荐用法,
但不要把它放到 http 或 server 块外层,
否则可能触发 Nginx 的 if 重写限制,
导致配置不生效或 500 报错。
验证防盗链是否生效
配置完成后,用带伪造 Referer 的方式访问图片进行测试。
在服务器或本机执行:
curl -I -e "http://www.baidu.com" https://www.example.com/wp-content/uploads/2025/01/test.jpg
如果返回 HTTP/1.1 403 Forbidden,说明非法来源已经被拦截。
再用自己的域名测试:
curl -I -e "https://www.example.com" https://www.example.com/wp-content/uploads/2025/01/test.jpg
正常返回 HTTP/1.1 200 OK,说明合法来源可以访问。
如果使用 CDN,
CDN 回源请求可能不带 Referer 或来源是 CDN 节点域名,
这时需要把 CDN 域名加入 valid_referers,
否则 CDN 缓存会大量失效,
甚至出现访问异常。
常见疑问:为什么加了防盗链流量还很高
这种情况多半不是因为图片直链,而是页面本身被频繁抓取,或静态资源体积太大、缓存时间太短。
防盗链只管来源,不管采集。
要降低流量消耗,可以同时做三件事:开启 Gzip 压缩、延长静态资源缓存时间、对单个 IP 的访问频率做限制。
另外,图片若被第三方站点以 no-referrer 方式加载(例如部分社交平台内嵌图片时主动隐藏来源),Nginx 会把它视为空 Referer。
如果这类平台对你很重要,可以考虑直接放行 none,否则对方会看到破图。
这是防盗链策略中的取舍问题,需要根据业务决定。
如果服务器内存和带宽都比较紧张,建议把防盗链配置和对象存储、CDN 结合使用。
CDN 回源时统一带上固定回源头,源站就只放行这个回源头来源,但 Nginx 对自定义头的校验需要用到 $http_origin 或 $http_referer 的额外判断,普通场景下用本文的 Referer 方案已经足够。
按照上述步骤配置完成后,你的独立站图片和静态资源就具备了基础的防盗刷能力。
遇到异常时,优先检查 valid_referers 里是否漏写了 CDN 域名,以及配置文件是否真的重载成功。