一、引言:你的流量正在被"偷"走!
想象一下这个场景:
- 你精心搭建了一个图片站,上传了大量高清壁纸。
- 某天你发现服务器流量暴增,账单飙升,但网站访问量却很平常。
- 经过排查,你发现很多图片链接被直接嵌入到其他论坛、博客甚至电商网站中。
这就是典型的 "盗链"(Hotlinking) 行为。别人直接使用你服务器上的资源(图片、视频、CSS、JS等),不仅消耗你的带宽和服务器资源,还可能带来安全风险。
Nginx 防盗链 ,就是解决这个问题的利器。它通过检查 HTTP 请求头中的 Referer 字段,来判断请求是否来自"合法"的网站,从而决定是正常返回资源还是拒绝服务。
💡 核心价值 :
配置防盗链,能有效节省服务器带宽成本,保护原创内容,并防止资源被恶意利用!
二、防盗链原理:Referer 头是关键
当用户在浏览器中点击一个链接或加载一个页面上的资源时,浏览器通常会在 HTTP 请求头中附带一个 Referer(注意,HTTP 标准里拼错了,应该是 Referrer)字段,其值就是当前页面的 URL。
例如:
- 用户在
https://www.yourblog.com/post/1页面上,加载了一张图片https://cdn.yourserver.com/image.jpg。 - 浏览器在请求这张图片时,会自动带上
Referer: https://www.yourblog.com/post/1。
防盗链的核心逻辑:
- Nginx 收到对静态资源(如
.jpg)的请求。 - 检查请求头中的
Referer。 - 如果
Referer的域名在"白名单"内(比如你自己的几个域名),则正常返回图片。 - 如果
Referer不在白名单内(甚至是空的),则拒绝请求,可以返回 403 错误或者一张"防盗链提示图"。
三、实战:Nginx 防盗链配置详解
Nginx 通过 ngx_http_referer_module 模块实现防盗链,主要使用 valid_referers 指令。
基础配置模板
location ~* \.(jpg|jpeg|png|gif|webp|mp4|flv|css|js)$ {
# 定义合法的来源(Referer)
valid_referers none blocked *.yourdomain.com yourdomain.com server_names;
# 如果来源不合法,则 $invalid_referer 变量会被设为 '1'
if ($invalid_referer) {
return 403; # 直接返回403禁止访问
# 或者,返回一张自定义的"请勿盗链"图片
# rewrite ^/.*$ /images/hotlinking.png break;
}
}
valid_referers 指令参数详解
| 参数 | 说明 |
|---|---|
none |
允许没有 Referer 头的请求。例如,用户直接在浏览器地址栏输入图片URL,或者从 HTTPS 页面链接到 HTTP 资源(出于安全考虑,浏览器不会发送 Referer)。 |
blocked |
允许 Referer 头存在,但其值被防火墙或代理服务器删除/伪装(值不以 http:// 或 https:// 开头)。 |
server_names |
允许 Referer 是当前 server_name 列表中的任意一个域名。 |
*.yourdomain.com |
使用通配符,允许所有子域名。 |
yourdomain.com |
允许指定的确切域名。 |
你可以根据自己的需求,组合使用以上参数。
进阶配置:返回友好提示图
直接返回 403 虽然有效,但用户体验不佳。更友好的做法是返回一张提示图片。
location ~* \.(jpg|jpeg|png|gif)$ {
valid_referers none blocked *.example.com example.com;
if ($invalid_referer) {
# 注意:这里使用 'break',因为我们不想再进行location匹配
rewrite ^/.*$ /static/images/no-hotlinking.png break;
}
# 其他常规设置
expires 30d;
add_header Cache-Control "public";
}
重要 :确保
/static/images/no-hotlinking.png这个路径不在 当前这个防盗链location块的匹配范围内,否则会形成死循环。
四、常见问题与注意事项
-
Referer并非绝对可靠:- 用户可以通过浏览器插件或隐私模式禁用
Referer。 - 恶意用户可以伪造
Referer头。
结论 :防盗链是一种低成本、高效率的防护手段,但不是万无一失的安全方案。对于核心敏感资源,应结合 Token 验证、CDN 鉴权等更强力的措施。
- 用户可以通过浏览器插件或隐私模式禁用
-
HTTPS 到 HTTP 的引用 :
出于安全考虑,当用户从一个 HTTPS 页面链接到一个 HTTP 资源时,现代浏览器默认不会发送
Referer。因此,配置中包含none参数通常是必要的,否则你自己网站的 HTTPS 页面也无法正常加载 HTTP 资源(虽然现在都推荐全站 HTTPS)。 -
搜索引擎爬虫 :
主流搜索引擎爬虫(如 Googlebot, Baiduspider)在抓取图片时,通常会将
Referer设置为图片所在页面的 URL。只要你的valid_referers包含了你自己的域名,就不会影响 SEO。 -
性能影响 :
if指令在 Nginx 中是有一定性能开销的,但对于防盗链这种针对静态资源的、低频的检查来说,影响微乎其微,完全可以接受。
五、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!