什么是防盗链
防盗链指的是防止其他网站未经许可直接引用你的资源(如图片、音视频文件、文档等)。这样做不仅能有效节约带宽,还能防止未经授权的内容被滥用。最常见的防盗链技术就是通过检查请求的referer
头部,判断请求的来源是否合法。
nginx 防盗链的基本原理
防盗链的原理通常是根据请求的 http referer 头 来判断请求是否来自授权域名。如果请求是从非授权的域名发起的,nginx 可以拒绝该请求。具体的防盗链实现方式有多种,常见的是基于 referer 和 ip 地址进行限制。
基于 referer 头的防盗链
referer 头是浏览器在发起 http 请求时自动添加的字段,指示当前请求是从哪个页面跳转过来的。防盗链的基本做法是,只有从自己的网站或者授权的域名发送的请求才能正常访问资源,其他来源的请求会被拒绝。
基本配置
以下是一个基于 referer 头的简单防盗链配置:
server { listen 80; server_name example.com; location ~* \.(jpg|jpeg|png|gif|bmp|webp|mp4)$ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; # 非授权的 referer,返回 403 错误 } } }
配置解释:
valid_referers
:指定允许访问资源的 referer 域名或 ip 地址。none
:表示没有 referer 字段的请求(例如,直接通过书签访问)。blocked
:表示 referer 字段为空或者包含非法字符的请求。example.com
:表示允许来自example.com
的请求。*.example.com
:表示允许来自example.com
子域名的请求。
if ($invalid_referer)
:如果请求的 referer 不符合上面的规则,nginx 会返回 403 错误,拒绝请求。
案例:保护图片资源
假设你的图片资源存放在 /var/www/example.com/images/
目录下,你希望只有来自你自己网站(如 example.com
)的请求能访问这些图片。其他域名(如盗链的第三方网站)访问时会返回 403 错误。
server { listen 80; server_name example.com; location /images/ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; # 拒绝盗链 } root /var/www/example.com; } }
这样,只有访问 example.com/images/
并且 referer 是 example.com
或其子域名的请求才会成功,其他站点盗链时将被拒绝。
基于 ip 地址的防盗链
除了使用 referer 头外,还可以通过限制 ip 地址来防止外部站点盗链。虽然这种方式不如基于 referer 的方法直接,但在某些情况下,结合使用会更加安全。
基本配置
server { listen 80; server_name example.com; location /images/ { allow 192.168.1.0/24; # 允许特定 ip 范围访问 deny all; # 拒绝其他 ip 访问 root /var/www/example.com; } }
配置解释:
allow
:允许特定 ip 或 ip 范围访问资源。deny
:拒绝其他 ip 的访问。
这种配置可以用于限制只允许公司内部的 ip 地址访问特定的资源。
防盗链的增强措施
为了进一步增强防盗链的效果,可以结合以下措施:
限制 http 方法
通过限制不必要的 http 方法,减少外部滥用的风险。
server { listen 80; server_name example.com; location /images/ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } limit_except get post { deny all; # 只允许 get 和 post 方法 } } }
使用 token 验证
你可以通过在请求 url 中使用加密的 token 来验证请求是否合法。只有合法的请求才能通过 nginx 访问资源。这种方法通常用于视频、音频等媒体资源的防盗链。
设置缓存时间
对不常更改的资源(如图片、视频等)设置合理的缓存时间,减少盗链带来的带宽消耗。
location ~* \.(jpg|jpeg|png|gif|bmp)$ { expires 30d; # 缓存 30 天 }
实际场景
防止图片被盗链
一个常见的实际场景是防止其他网站盗用你网站的图片。如果你的图片资源很大,被其他站点盗用会导致带宽浪费,同时也可能影响你网站的加载速度和 seo 排名。你可以通过 nginx 配置 referer 防盗链,只允许自己的站点加载图片。
保护下载文件
对于一些需要付费或特定用户才可以下载的文件(如电子书、软件包等),你可以通过防盗链策略来确保只有购买或注册的用户能访问这些资源。
server { listen 80; server_name example.com; location /downloads/ { valid_referers none blocked example.com; if ($invalid_referer) { return 403; } root /var/www/example.com; } }
视频盗链防护
在视频流媒体的场景下,防盗链尤为重要,尤其是在视频网站或教育平台中,防止其他网站通过直接 url 请求来盗用视频资源。可以结合 referer 防盗链和 ip 限制来进行防护。
到此这篇关于nginx实现防盗链的多种方式的文章就介绍到这了,更多相关nginx实现防盗链内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论