Nginx防盗链配置

一、引言:你的流量正在被"偷"走!

想象一下这个场景:

  • 你精心搭建了一个图片站,上传了大量高清壁纸。
  • 某天你发现服务器流量暴增,账单飙升,但网站访问量却很平常。
  • 经过排查,你发现很多图片链接被直接嵌入到其他论坛、博客甚至电商网站中。

这就是典型的 "盗链"(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

防盗链的核心逻辑

  1. Nginx 收到对静态资源(如 .jpg)的请求。
  2. 检查请求头中的 Referer
  3. 如果 Referer 的域名在"白名单"内(比如你自己的几个域名),则正常返回图片。
  4. 如果 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 块的匹配范围内,否则会形成死循环。


四、常见问题与注意事项

  1. Referer 并非绝对可靠

    • 用户可以通过浏览器插件或隐私模式禁用 Referer
    • 恶意用户可以伪造 Referer 头。

    结论 :防盗链是一种低成本、高效率的防护手段,但不是万无一失的安全方案。对于核心敏感资源,应结合 Token 验证、CDN 鉴权等更强力的措施。

  2. HTTPS 到 HTTP 的引用

    出于安全考虑,当用户从一个 HTTPS 页面链接到一个 HTTP 资源时,现代浏览器默认不会发送 Referer 。因此,配置中包含 none 参数通常是必要的,否则你自己网站的 HTTPS 页面也无法正常加载 HTTP 资源(虽然现在都推荐全站 HTTPS)。

  3. 搜索引擎爬虫

    主流搜索引擎爬虫(如 Googlebot, Baiduspider)在抓取图片时,通常会将 Referer 设置为图片所在页面的 URL。只要你的 valid_referers 包含了你自己的域名,就不会影响 SEO。

  4. 性能影响
    if 指令在 Nginx 中是有一定性能开销的,但对于防盗链这种针对静态资源的、低频的检查来说,影响微乎其微,完全可以接受。


五、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
颖火虫盟主3 小时前
Linux 系统分层架构:从硬件通电到 systemd 进程管理
linux·运维·架构
cui_ruicheng3 小时前
Linux网络编程(九):应用层协议与序列化
linux·运维·服务器·网络
kobe_OKOK_4 小时前
ubuntu server 存儲空間占滿的原因
linux·运维·ubuntu
Nian.Baikal4 小时前
从零搭建离线地图服务:Nginx + Cesium/Leaflet 实战指南
运维·前端·nginx
百度智能云技术站4 小时前
当 CPU 成为 GPU 的隐性瓶颈:Btune 2.0 用自动化耗时分析打破性能黑盒
运维·自动化·gpu算力
电商API_180079052474 小时前
京东API对接|实现批量自动化获取京东商品价格更新商品库
大数据·运维·数据挖掘·自动化·网络爬虫
菜鸟是大神4 小时前
07-Claude Code 的常用命令和快捷键
linux·运维·服务器
hj2862515 小时前
Linux存储空间管理完整笔记
linux·运维·笔记