通过EdgeOne的边缘函数实现防盗链

· 记录

在之前的文章中提到,可以利用Cloudflare免费WAF实现零成本网站图片防盗链1,本文将介绍如何在 EdgeOne 中实现同样的功能。

目录


设置边缘函数


1. 选择“访问控制”模板

点击左侧高级能力 -- 边缘函数 -- 函数管理,在给定的模板中选择访问控制

image.png

2. 函数命名

为函数设置一个任意的名称(例如:image-hotlink-protection)。

3. 修改代码

将函数代码修改如下:

async function handleRequest(request) {
  const allowedDomains = env.ALLOWED_DOMAINS;

  if (!allowedDomains || !Array.isArray(allowedDomains) || allowedDomains.length === 0) {
    return new Response('Server Configuration Error: ALLOWED_DOMAINS environment variable is not set correctly.', { status: 500 });
  }

  const referer = request.headers.get('Referer');

  // 放行空 Referer,否则图床自身也无法访问图片
  if (!referer) {
    return fetch(request);
  }

  let refererHost;
  try {
    refererHost = new URL(referer).hostname;
  } catch (err) {
    return new Response('Invalid Referer.', { status: 403 });
  }

  // --- 核心逻辑修改在这里 ---
  let isAllowed = false;
  for (const domain of allowedDomains) {
    // 检查 refererHost 是否等于白名单域名,或者以 ".白名单域名" 结尾(支持子域名)
    if (refererHost === domain || refererHost.endsWith('.' + domain)) {
      isAllowed = true;
      break; // 找到匹配项,无需继续循环
    }
  }
  // --- 修改结束 ---

  if (isAllowed) {
    return fetch(request);
  } else {
    return new Response('Hotlink protection: Access denied.', { status: 403 });
  }
}

// addEventListener 部分保持不变
addEventListener('fetch', event => {
  event.passThroughOnException();
  event.respondWith(handleRequest(event.request));
});

主要修改点:

新增触发规则


为函数创建一个新的触发规则。

image.png

设置匹配类型为HOST,运算符为等于,并在值中输入图床域名。

image.png

设置环境变量2


在函数管理页面,找到环境变量配置。

image.png

image.png

变量名设置为 ALLOWED_DOMAINS变量类型选择 JSON,然后在下方的值中输入需要加入白名单的域名数组。

image.png

重要提示:每次修改完变量后,别忘了单独点击部署以使更改生效。

至此,在EdgeOne上设置图片防盗链的操作已经全部完成,可以测试测试效果了。

NOTES


  1. 利用Cloudflare免费WAF实现零成本网站图片防盗链(https://bb.bins.fyi/archives/31/) 

  2. EdgeOne环境变量文档(https://edgeone.ai/zh/document/62764) 

本文作者: 𝓬𝓸𝓵𝓪 🚀
本文链接: https://bb.bins.fyi/archives/156/
最后修改:
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!