通过在 Nginx 中防止盗链,你可以保护站点的图片和媒体文件不被未授权使用。valid_referers 指令可以让你控制哪些网站可以访问你的资源。如果有人从未授权站点盗链你的文件,Nginx 会返回 403 forbidden 错误。这种方式可以帮助你节省带宽并保护内容安全,对香港服务器租用环境尤为重要。许多站点所有者都依赖 valid_referers 来管理访问并阻止不需要的请求。

重点速览

  • 盗链会在未获许可的情况下占用你的服务器资源,造成带宽被盗用和成本上升。
  • 在 Nginx 中设置 referer 白名单,可以控制哪些网站能访问你的图片和媒体文件。
  • 测试 Nginx 配置,确保它能够阻止未授权请求,并允许可信域名访问。
  • 定期审查和更新你的白名单,以保持盗链防护的有效性。
  • 可以结合图片水印、CDN 等额外手段,进一步增强防盗链保护。

为什么要防止盗链

什么是盗链

你可能在某些网站上看到图片或视频实际上来自另一个网站。这种做法就叫做盗链。当某个网站直接链接到你服务器上托管的图片或视频等文件时,它会在未经你允许的情况下使用你的资源。盗链也称为内联链接(inline linking)。对方不保存或上传内容,而是直接指向你的文件。这会导致你的带宽被过度占用,即使内容展示在别人的网站上。许多人认为盗链是不道德的行为,因为它在未经允许的情况下使用了他人的资源。

盗链带来的风险

如果你不采取措施防止盗链,你的网站可能会面临多种问题:

  • 带宽被盗用:盗链会消耗你的服务器带宽。例如,一个 250KB 的图片每天被访问 2,000 次,一个月就可能消耗高达 15GB 的带宽。带宽消耗会迅速累积,导致更高的服务器费用。
  • 性能受影响:当未授权网站大量使用你的文件时,你自己的网站可能会变慢。请求数量增加会影响访问者体验,甚至降低搜索引擎排名。
  • 内容控制权丧失:你会失去对内容展示位置和展示方式的控制。如果你修改或删除文件,被盗链的内容可能会失效或显示过期信息。
  • 法律与道德问题:盗链可能违反版权法律。

    盗链在法律层面存在风险,尤其涉及版权侵权。未经允许使用他人资源,可能侵犯知识产权,使实施盗链的网站面临法律后果。

  • 安全风险:当其他网站依赖你的文件时,你可能会暴露敏感信息,或成为攻击目标。
  • 链接失效(Link Rot):如果你删除或移动文件,被盗链的内容就会消失,在其他网站上留下破图或失效的视频链接。

现在,许多虚拟主机和服务器租用提供商都将防盗链作为标准功能。例如:

服务商盗链策略
AwardSpace对所有免费共享账户默认启用防盗链保护,阻止浏览器直接访问图片文件,以保护带宽。

你可以通过配置服务器、使用 CDN、给图片添加水印等方式来防止盗链。这些步骤有助于保护你的资源,并让网站保持稳定运行。

如何在 Nginx 上阻止盗链

Nginx Referer 白名单说明

你可以通过使用 referer 白名单在 Nginx 上阻止盗链。这种方法能让你决定哪些网站可以加载你的图片或媒体文件。Referer 白名单通过检查每个请求里的 referer 头来工作。如果 referer 头匹配白名单中的域名,Nginx 就允许该请求;否则,Nginx 会阻止它。

valid_referers 指令是完成这项工作的核心工具。你使用它来设置允许的 referer 列表。valid_referers 指令的作用包括:

  • 指定 referer 头允许的取值。
  • 根据请求来源控制对资源的访问。
  • 允许或阻止请求,取决于 referer 是否有效。

当你设置了 referer 白名单,就能防止带宽被盗用,并对内容保持控制权。你可以使用通配符来涵盖所有子域,也可以逐一列出允许访问的域名。例如,*.example.com 可以允许 blog.example.comshop.example.com 等所有子域。

Referer 头在防盗链中非常关键。如果请求携带的 referer 不在白名单中,Nginx 就会阻止该请求。如果 referer 头缺失或看起来可疑,Nginx 也可以拒绝请求,从而提供更强的盗链防护。

配置示例

你可以通过编辑 Nginx 配置文件来设置防盗链。下面是一个使用 referer 白名单的示例配置:

server {
    listen 80;
    server_name cdn.example.com;

    location /images/ {
        # Block hotlinking from other sites
        valid_referers none blocked server_names
        *.example.com example.com;

        if ($invalid_referer) {
            return 403;
        }

        alias /var/www/images/;
    }
}

我们来分解一下这个配置的关键部分:

  • server 块监听发往 cdn.example.com 的请求。
  • location /images/ 块将规则应用于该目录下的所有图片。
  • valid_referers 指令用来设置白名单。它允许没有 referer 头、被标记为 blocked 的 referer 头,或与当前服务器名、任意 example.com 子域以及 example.com 本身匹配的 referer。
  • if ($invalid_referer) 块检查 referer 是否无效。如果无效,Nginx 返回 403 forbidden 错误。
  • alias 指令告诉 Nginx 到服务器上的哪个目录中去寻找图片。

你可以在 valid_referers 指令中使用通配符。例如,*.example.com 可以匹配 blog.example.comshop.example.com 等所有子域。如果你需要允许多个站点,可以把多个域名依次列出。

如果你想在 Nginx 中阻止盗链,但不想返回 403 forbidden,而是展示一个自定义图片,也可以修改返回结果。例如,你可以重定向到一个占位图像,示例如下:

if ($invalid_referer) {
    return 302 /images/placeholder.jpg;
}

这一行告诉 Nginx:如果有人尝试盗链你的文件,就把对方重定向到占位图片。

防盗链策略在经过测试后效果最好。请确保你的 referer 白名单中只包含可信域名。你还可以把这种方法与其他工具结合使用,比如安全签名(token)或 .htaccess 防盗链(在 Apache 上),以获得更高的安全性。

Referer 头是阻止不必要请求的关键。通过在站点配置中设置严格的白名单,你可以有效防止盗链,保护自己的资源。如果你遵循以上步骤,就能在 Nginx 上搭建起一个稳固的防盗链方案。

实施并测试你的 Nginx 配置

编辑并重载 Nginx 配置

你需要更新 Nginx 配置文件来启用防盗链。首先,使用文本编辑器打开 Nginx 配置文件,例如 nanovim。在终端中运行如下命令:

sudo nano /etc/nginx/sites-available/default

找到你希望启用防盗链的配置区域,并按照前面的示例添加 referer 白名单规则。编辑完成后保存文件。

接下来,检查配置是否有语法错误,运行:

sudo nginx -t

如果看到成功的提示信息,就可以重载 Nginx 以应用新配置:

sudo systemctl reload nginx

现在你的服务器已经更新完成。Nginx 会开始阻止不符合 referer 白名单的请求。如果配置有误,Nginx 会输出错误信息。因此在重载之前,一定要先测试配置。

提示:在修改 Nginx 配置之前,务必备份配置文件。如果出现问题,你可以轻松恢复原有设置。

测试允许和被阻止的域名

测试非常重要,它可以确认你的防盗链配置是否生效。你需要确保 Nginx 能够允许来自可信域名的请求,并对其他请求返回 403 forbidden 错误。

可以按照以下步骤进行测试:

  1. 在浏览器中直接访问来自你自己域名的图片或媒体文件,确认文件能正常加载。
  2. 尝试从另一个域名访问同一个文件,或者通过无 referer 的直接链接访问。此时 Nginx 应该返回 403 forbidden 错误。
  3. 使用在线工具或浏览器扩展伪造或修改 referer 头,分别用允许和不允许的值进行测试。
  4. 检查 Nginx 日志中的 403 forbidden 记录,确认 Nginx 正在阻止不需要的请求。

如果本应允许的访问也返回 403 forbidden,请重新检查白名单,确保已包含所有可信域名。如果发现 Nginx 仍然允许不在白名单中的站点盗链,则需要仔细核对 referer 规则。

注意:某些浏览器或工具并不总是发送 referer 头。你可以根据实际需求调整规则,来处理缺失或被清除的 referer。

通过测试你的配置,可以确保防盗链策略有效保护了你的资源。每次更新 Nginx 配置后,都可以重复这些步骤进行验证。

排查防盗链配置问题

常见配置错误

在 Nginx 中设置防盗链时,你可能会遇到一些常见问题,这些问题会导致规则未按预期生效。下面的表格列出了最常见的配置错误及其说明:

配置问题说明
Referer 设置不正确如果 referer 选项配置有误,其他站点仍然可能访问你的图片。
与 Cloudflare 的兼容性将 Cloudflare 与 Nginx 一起使用时,可能导致防盗链规则失效或行为异常。
处理空 referer 的方式如果忽略空 referer,用户可以直接访问图片,这会削弱防盗链效果。

你可以通过以下步骤诊断和修复这些问题:

  • 检查 Web 应用防火墙(WAF)日志,查看被拦截的请求。
  • 审查你的防火墙规则,例如基于 IP 或地域的过滤策略。
  • 确认文件权限是否正确:文件使用 644,目录使用 755。
  • 检查身份验证配置是否影响访问。
  • 重新查看 Nginx 中的防盗链(hotlinking)规则是否书写正确。
  • 使用 curlwget 等工具测试,查看原始响应头是否符合预期。

只要按这些步骤排查,大多数导致防盗链失败的问题都能被及时发现和解决。

处理缺失或伪造的 Referer

有时,请求可能不带 referer 头,或者 referer 被伪造。这可能因为多种原因造成:

  • 服务器配置错误会导致 referer 缺失或被篡改。
  • 某些 Referrer Policy 会主动移除 referer 头。
  • 从 HTTPS 跳转到 HTTP 时,referer 通常会被丢弃。
  • valid_referers 中允许 none,可能会让不希望的请求绕过防护。

你可以通过调整 Nginx 配置来处理这些情况。valid_referers 指令允许你控制 Nginx 如何对待缺失或可疑的 referer。如果设置得当,可以阻止大多数试图通过伪造 referer 绕过防盗链的行为。但要谨慎配置,因为不安全的设置会让攻击者更容易伪造 referer 并访问你的文件。

提示:每次修改防盗链配置后,都要进行测试。使用不同浏览器和工具,检查规则是否正确拦截了不需要的请求,同时允许可信访问。

你可以通过在 Nginx 中执行几个清晰的步骤来防止盗链。下面的表格总结了主要操作:

步骤说明
1修改 Nginx 配置文件,为图片类型文件添加一个 location 块。
2在配置中指定有效的 referer,只允许来自你自己域名及其他授权域名的访问。
3为无效 referer 设置返回结果,例如返回 “403: Access Denied” 错误。

通过这种方式,可以保护你的资源并节省带宽。你还可以结合图片水印、服务器冗余架构或内容分发网络(CDN)等高级方案,进一步增强防盗链保护。定期测试有助于保持配置的有效性和安全性。

常见问答(FAQ)

如何在 Nginx referer 白名单中允许多个域名?

你可以在 valid_referers 指令中依次列出多个域名。例如:

valid_referers example.com *.example.com trustedsite.com;

这类配置可以同时允许主站、所有子域以及另一个可信域名访问。

如果浏览器不发送 referer 头会怎样?

Nginx 会根据你的配置来处理没有 referer 的请求。如果在 valid_referers 中包含 none,Nginx 就会允许这些请求;如果不包含,Nginx 会将它们视作无效并阻止。

用户是否可以通过修改 referer 绕过防盗链?

某些用户可以尝试伪造 referer 头。Nginx 会检查该头部,但无法阻止所有高级伪造行为。你可以通过使用签名 URL 或访问令牌等方式,增加额外的安全层。

防盗链会影响搜索引擎吗?

大多数搜索引擎不会盗链图片。如果你阻止空 referer,一些爬虫可能无法访问你的文件。必要时,你可以将搜索引擎的域名加入白名单。

我能在哪里查看被阻止的请求?

你可以在 Nginx 访问日志中查看状态码为 403 的记录,类似:

"GET /images/photo.jpg" 403

这条记录表示 Nginx 已经根据防盗链规则阻止了该请求。