如何使用 Nginx Referer 白名单配置防止盗链

通过在 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.com、shop.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.com、shop.example.com 等所有子域。如果你需要允许多个站点,可以把多个域名依次列出。
如果你想在 Nginx 中阻止盗链,但不想返回 403 forbidden,而是展示一个自定义图片,也可以修改返回结果。例如,你可以重定向到一个占位图像,示例如下:
if ($invalid_referer) {
return 302 /images/placeholder.jpg;
}
这一行告诉 Nginx:如果有人尝试盗链你的文件,就把对方重定向到占位图片。
防盗链策略在经过测试后效果最好。请确保你的 referer 白名单中只包含可信域名。你还可以把这种方法与其他工具结合使用,比如安全签名(token)或 .htaccess 防盗链(在 Apache 上),以获得更高的安全性。
Referer 头是阻止不必要请求的关键。通过在站点配置中设置严格的白名单,你可以有效防止盗链,保护自己的资源。如果你遵循以上步骤,就能在 Nginx 上搭建起一个稳固的防盗链方案。
实施并测试你的 Nginx 配置
编辑并重载 Nginx 配置
你需要更新 Nginx 配置文件来启用防盗链。首先,使用文本编辑器打开 Nginx 配置文件,例如 nano 或 vim。在终端中运行如下命令:
sudo nano /etc/nginx/sites-available/default
找到你希望启用防盗链的配置区域,并按照前面的示例添加 referer 白名单规则。编辑完成后保存文件。
接下来,检查配置是否有语法错误,运行:
sudo nginx -t
如果看到成功的提示信息,就可以重载 Nginx 以应用新配置:
sudo systemctl reload nginx
现在你的服务器已经更新完成。Nginx 会开始阻止不符合 referer 白名单的请求。如果配置有误,Nginx 会输出错误信息。因此在重载之前,一定要先测试配置。
提示:在修改 Nginx 配置之前,务必备份配置文件。如果出现问题,你可以轻松恢复原有设置。
测试允许和被阻止的域名
测试非常重要,它可以确认你的防盗链配置是否生效。你需要确保 Nginx 能够允许来自可信域名的请求,并对其他请求返回 403 forbidden 错误。
可以按照以下步骤进行测试:
- 在浏览器中直接访问来自你自己域名的图片或媒体文件,确认文件能正常加载。
- 尝试从另一个域名访问同一个文件,或者通过无 referer 的直接链接访问。此时 Nginx 应该返回 403 forbidden 错误。
- 使用在线工具或浏览器扩展伪造或修改 referer 头,分别用允许和不允许的值进行测试。
- 检查 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)规则是否书写正确。
- 使用
curl或wget等工具测试,查看原始响应头是否符合预期。
只要按这些步骤排查,大多数导致防盗链失败的问题都能被及时发现和解决。
处理缺失或伪造的 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 已经根据防盗链规则阻止了该请求。
