介绍
在之前的文章中,讲解了如何在Cloudflare的防火墙中配置防盗链规则,帮助你防止不合法的外部站点盗用你网站的资源。在这篇文章中,将介绍如何通过 Cloudflare Workers 来实现更为灵活的防盗链策略。
一、什么是Cloudflare Workers?
Cloudflare Workers 是一个强大的工具,它允许你在Cloudflare的边缘网络上运行JavaScript代码,从而对请求和响应进行细粒度的控制。与防火墙规则不同,Workers能够让你在请求到达服务器之前,直接在Cloudflare的边缘节点上拦截并处理请求。
二、配置Cloudflare Workers防盗链规则
现在,让我们一步步配置一个基本的防盗链规则,确保只有你的站点和合法的搜索引擎能够访问你的资源。
步骤1:创建一个新的Worker脚本
- 登录到你的Cloudflare账户,进入 Workers 页面。
- 点击 创建Worker,进入脚本编辑页面。
- 在编辑器中,你将编写JavaScript代码来检查请求的 Referer 头,并确保只有合法的请求能访问你的资源。
步骤2:编写防盗链规则代码
在Cloudflare Workers中,我们可以使用 JavaScript 来检查 Referer
头,判断请求是否来自合法的来源。以下是一个简单的防盗链脚本示例:
主要代码解释:
addEventListener('fetch', event => {...})
- 该事件监听器捕捉所有传入的 HTTP 请求(fetch 请求),并将其交给
handleRequest()
函数处理。 event.respondWith(handleRequest(event.request))
:这一行代码会接收请求并传递给handleRequest
函数进行处理。
- 该事件监听器捕捉所有传入的 HTTP 请求(fetch 请求),并将其交给
async function handleRequest(request)
handleRequest
是一个异步函数,它接受 HTTP 请求对象request
作为参数,处理并返回一个响应。- 通过
new URL(request.url)
,你可以获取请求的 URL 地址。 const referer = request.headers.get('Referer') || '';
:获取请求头中的Referer
字段,这通常用于标识请求来源的页面。|| ''
是为了防止Referer
不存在时赋值为空字符串。const userAgent = request.headers.get('User-Agent') || '';
:获取请求头中的User-Agent
字段,标识发送请求的浏览器或爬虫。
- 定义有效的 Referer 来源
const validReferers = ['joyb.cc', 'www.joyb.cc'];
:在这里,定义了有效的 Referer 来源。只有来源于joyb.cc
和www.joyb.cc
的请求被认为是合法的。const isValidReferer = validReferers.some(valid => referer.includes(valid));
:检查Referer
是否属于有效来源之一。
- 检查请求是否来自搜索引擎爬虫
const isSearchEngineBot = isBot(userAgent);
:调用isBot
函数,检查请求的User-Agent
是否是搜索引擎爬虫的标识。
- 判断是否为图片请求且 Referer 无效
if (isImageRequest(url) && !isValidReferer && !isSearchEngineBot)
:如果请求是图片请求(通过isImageRequest
函数检查),并且Referer
无效且不是搜索引擎爬虫,则认为这是非法请求。return new Response(generateErrorPage(), {...});
:对非法请求返回一个 403 错误页面,使用generateErrorPage
函数生成一个自定义的错误页面。
- 强制浏览器直接显示图片
if (isImageRequest(url))
:如果是图片请求,继续执行以下代码:return fetch(request, {...});
:返回图片的请求响应,并且通过设置响应头来控制浏览器如何处理该资源。'Content-Disposition': 'inline'
:强制浏览器直接显示图片,而不是下载。'Cache-Control': 'no-store'
:防止浏览器缓存图片,确保每次请求都会重新获取资源。
- 继续处理有效请求
return fetch(request);
:对于所有其他请求(不涉及图片或已通过验证的请求),直接返回正常的请求响应。
辅助函数解析
isImageRequest(url)
- 该函数检查请求 URL 是否为图片请求。具体来说,它判断请求的路径中是否包含
/wp-content/uploads/
(默认的上传路径),并且文件后缀是否为图片格式(.jpg
,.jpeg
,.png
,.gif
,.webp
)。
- 该函数检查请求 URL 是否为图片请求。具体来说,它判断请求的路径中是否包含
isBot(userAgent)
- 该函数通过正则表达式检查
User-Agent
是否包含常见的搜索引擎爬虫的标识符(如 Googlebot, Bingbot, Baiduspider 等)。如果是,返回true
,否则返回false
。
- 该函数通过正则表达式检查
generateErrorPage()
- 该函数返回一个 HTML 错误页面的字符串。该页面会显示一个定制的错误信息,并通过音频、按钮等方式提醒用户请求被拒绝。
- 页面样式:通过 CSS 设置了页面的背景、文字、按钮等元素的样式,使用了动画效果让错误页面更具视觉吸引力。
- 音频:页面内包含了一个自动播放的音频文件,作为额外的提示(你可以根据需要修改音频文件链接)。
步骤3:部署并测试Worker
- 在脚本编辑器中,点击 保存并部署 按钮,将你的 Worker 脚本部署到Cloudflare的边缘网络。
- 在部署完成后,你需要配置路由,确保你的Worker脚本处理正确的请求路径。你可以选择为
/wp-content/uploads/
目录下的文件创建路由:joyb.cc/wp-content/uploads/*
- 保存路由设置后,测试你的防盗链规则。你可以通过访问你网站的资源,或者尝试从其他网站进行盗链测试,查看是否能够成功拦截非法请求。
三、Cloudflare Workers 防盗链规则的优势
与传统的防火墙规则相比,只用Cloudflare Workers 配置防盗链规则,你可以更精确地控制哪些请求可以访问你的网站资源,哪些请求应该被拦截。并且可以自定义返回错误提示页面(页面中包含返回你网站的链接按钮,这样引用你网站的爬虫蜘蛛就会跑到你网站,也可以直接重定向)。还能返回一张不可描述的图片(但这个图片地址千万别用自己的)。如果之前有人引用你网站上的图片时,那就有得看了。哈哈。所以千万别用他人站点的链接资源防止互相伤害。最好是下载到本地。
- 更灵活的控制:Cloudflare Workers 允许你完全自定义请求的处理方式,可以精确控制哪些请求可以访问资源,哪些请求应被拦截。
- 边缘计算:由于Workers在Cloudflare的边缘节点上运行,所有的请求检查都是在接近用户的地方进行的,从而极大地提高了性能和响应速度。
- 无需访问源服务器:Workers处理请求时,不需要经过原始服务器,可以有效减轻服务器的负担。
四、注意事项
尽管Cloudflare Workers提供了更强大的防盗链控制能力,但也有一些需要注意的地方:
- 客户端绕过:像所有的防盗链措施一样,Cloudflare Workers 只能在请求到达你的服务器之前进行拦截,客户端仍然可以通过修改
Referer
来绕过规则。因此,防盗链主要起到防止其他站点非法引用资源的作用,无法完全防止用户下载资源。 - 维护和更新:,你可能需要定期更新允许的
Referer
列表,以便与新的搜索引擎保持兼容。
© 版权声明
THE END