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


五、结语

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

相关推荐
AR-26710-24 分钟前
Linux Day32——实操五类资源告急排查
linux·运维
skywalk816343 分钟前
hive 常驻集群:像 OSPF 一样在线,像 git 一样可信
运维·人工智能·hive
景煜拾年2 小时前
InnoAI SQL 助手
运维·数据库·笔记·sql
无人生还别怕3 小时前
如何搭建docker仓库(轻量级)registry
linux·运维·docker·云原生·容器·registry·openanolisos
分布式存储与RustFS3 小时前
Hudi 表想摆脱 HDFS 绑定?用 Spark + Hudi 直接写进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
zhengfei6114 小时前
CVE-2026-98432:Linux 内核 TCP 释放后重用漏洞,CVSS 9.8 但补丁覆盖极不均衡
linux·运维·tcp/ip
逐流人4 小时前
DevOps 入门实战(一):从 CI/CD 概念到 Jenkins 自动构建部署
运维·云原生·云计算·jenkins·devops
xyzzklk4 小时前
变相解决华为Mate 8锁屏后无法建立入站网络连接
linux·运维·服务器·网络·华为·go·安卓
叼烟扛炮6 小时前
Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式
linux·运维·服务器·网络·笔记·学习·php
飞飞传输14 小时前
飞驰云联文件交换建设方法论:从单点传输到持续治理
大数据·运维·安全