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 中是有一定性能开销的,但对于防盗链这种针对静态资源的、低频的检查来说,影响微乎其微,完全可以接受。


五、结语

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

相关推荐
judezh4 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
春天花会开1314 小时前
内网 HTTPS 部署实战:私有 CA + Nginx 反向代理全流程复盘
运维·nginx·https
AllFiles4 小时前
K8s Node Exporter 异常 Write 超时排查实录
运维·后端·kubernetes
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
还是大剑师兰特6 天前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
AI职业加油站6 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏6 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
xing-xing6 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅6 天前
linux(8) 软硬链接
linux·运维·服务器
张洛闻Eren6 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github