分类 杂乱 下的文章

基于 Cloudflare Workers 与 R2 的博客图片代理部署指南

本文详细介绍了如何利用 Cloudflare WorkersR2 存储桶搭建一个为博客服务的图片代理服务。该方案能够实现图片的高效托管、跨域访问与长期缓存,从而提升博客的图片加载速度与兼容性。


一、方案概述

整个方案分为三个核心步骤:

  1. 配置 R2 存储桶:创建存储桶,开启公共访问,并配置 CORS 策略。
  2. 部署 Workers 代理:编写并部署一个 Worker 脚本,用于代理和缓存图片请求。
  3. 绑定自定义域名:为 Workers 服务配置自定义域名(如博客域名),完成服务集成。

最终实现一个高效、可缓存且支持跨域的博客图片托管与代理服务。


二、配置 Cloudflare R2 存储桶

2.1 创建存储桶并开启公共访问

  1. 在 Cloudflare 控制台中创建 R2 存储桶。
  2. 为该存储桶开启 公共开发 URL,以便通过固定域名访问桶内资源。

2.2 配置 CORS 策略

为允许您的博客域名跨域访问图片,需在 R2 存储桶设置中添加 CORS 策略。

配置示例(JSON):

[
  {
    "AllowedOrigins": [
      "https://lonecho.com",
      "https://www.lonecho.com"
    ],
    "AllowedMethods": [
      "GET"
    ],
    "AllowedHeaders": [
      "*"
    ],
    "MaxAgeSeconds": 3600
  }
]
说明:此策略仅允许来自指定域名的 GET 请求,预检请求缓存时间为 3600 秒。其余配置可保持默认。

配置截图参考:

  • 存储桶概览与公共 URL 设置
    设置.png
  • CORS 策略配置界面 (1)
    屏幕截图 2026-01-28 221219.png
  • CORS 策略配置界面 (2)
    屏幕截图 2026-01-28 221335.png

三、部署 Cloudflare Workers 代理服务

3.1 创建应用

在 Cloudflare 控制台的 Workers 和 Pages 中创建新应用,选择 helloworld 模板。

3.2 部署代理脚本

将模板代码替换为以下脚本,并R2_PUBLIC_URL 修改为您自己的 R2 公共域名

// 配置:你的 R2 存储桶的公共访问域名
const R2_PUBLIC_URL = 'https://pub-b6f3这里是公共开发 URL 11.r2.dev'; // 请替换为你的实际域名

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const path = url.pathname;

    // 记录请求日志
    console.log(`[${new Date().toISOString()}] ${request.method} ${path}`);

    // 根路径返回服务说明
    if (path === '/') {
      return new Response('Image Proxy Service for Blog\n访问 https://blog.lonecho.com/图片文件名.jpg 使用', {
        headers: { 'content-type': 'text/plain;charset=UTF-8' }
      });
    }

    // 仅允许图片文件
    const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico'];
    const isImageRequest = imageExtensions.some(ext => path.toLowerCase().endsWith(ext));
    
    if (!isImageRequest) {
      return new Response('Only image files are allowed', { status: 400 });
    }

    // 仅允许 GET 请求
    if (request.method !== 'GET') {
      return new Response('Method not allowed', { status: 405 });
    }

    // 构造 R2 图片 URL
    const imageUrl = `${R2_PUBLIC_URL}${path}`;

    // 利用 Cloudflare 缓存
    const cacheKey = new Request(imageUrl, request);
    const cache = caches.default;

    let response = await cache.match(cacheKey);

    if (!response) {
      console.log(`Cache miss: ${path}`);
      
      // 缓存未命中,从 R2 获取图片
      response = await fetch(imageUrl);

      if (response.status === 404) {
        console.log(`Image not found: ${path}`);
        return new Response('Image not found', { status: 404 });
      }

      // 复制响应以便缓存
      response = new Response(response.body, response);

      // 设置缓存控制头:30 天
      response.headers.set('cache-control', 'public, max-age=2592000, immutable');
      response.headers.set('cdn-cache-control', 'max-age=2592000');
      
      // 添加 CORS 头,允许跨域访问
      response.headers.set('access-control-allow-origin', '*');
      response.headers.set('access-control-allow-methods', 'GET, HEAD');

      // 存入缓存
      ctx.waitUntil(cache.put(cacheKey, response.clone()));
    } else {
      console.log(`Cache hit: ${path}`);
    }

    return response;
  }
};

脚本功能说明:

  • 请求过滤:仅代理图片文件(如 .jpg, .png 等)的 GET 请求。
  • 缓存机制:利用 Cloudflare 全球缓存,为图片设置 30 天(2592000 秒)的长期缓存。
  • CORS 支持:在响应中添加 Access-Control-Allow-Origin: * 等头部,确保跨域访问正常。
  • 日志记录:输出缓存命中/未命中及错误日志,便于调试。

四、配置自定义域名与测试

4.1 绑定自定义域名

在 Workers 应用设置中,添加您的博客域名(例如 https://blog.lonecho.com)作为自定义域名。

配置截图参考:
屏幕截图 2026-01-28 222032.png

4.2 服务测试

部署完成后,建议使用专业工具进行测试,以确保缓存策略与 CORS 配置生效。

推荐测试工具:

  • REDbot:用于检查 HTTP 缓存和 CORS 头部。
  • 浏览器开发者工具:检查网络请求的 Response Headers,确认 cache-controlaccess-control-allow-origin 等字段是否正确返回。

五、总结

通过以上步骤,您已经成功搭建了一个基于 Cloudflare 生态的图片代理服务。此方案具有以下优势:

  1. 性能优异:利用 Cloudflare 全球边缘网络和缓存,大幅提升图片加载速度。
  2. 成本可控:R2 存储定价低廉,Workers 免费额度足以应对中小型博客流量。
  3. 配置灵活:通过 Workers 脚本可轻松定制缓存策略、访问规则和错误处理。
  4. 维护简单:无需自建服务器,所有服务均在 Cloudflare 平台统一管理。

现在,您可以在博客中使用形如 https://blog.lonecho.com/图片文件名.jpg 的链接来访问托管在 R2 中的图片了。


好的,已为您润色。以下提供了两个版本,均保持了原文的核心意思和Markdown格式,但在表达上更为流畅和专业。

屏幕截图 2026-01-27 233606.png

ai.png

ai2.png

ai3.png

版本一 (偏向简洁、直接)

这是一个测试页面。

我忽然想到,我最喜欢的AI助手是智谱AI。因为它不仅功能强大,更重要的是,它为我提供了免费使用的渠道,这恰好能巧妙地遮蔽我囊中羞涩的现实


版本二 (偏向书面、文雅)

这是一个测试页面。

我忽然想到,我最偏爱的AI助手是智谱AI。其最大的吸引力,在于它慷慨的免费使用政策。这让我在享受前沿科技便利的同时,也能体面地遮掩囊中羞涩,免于为高昂费用而烦恼。


润色说明:

  1. 逻辑梳理:将原文的两个句子整合成一个更连贯的段落,阐明了“免费”是“喜欢”智谱AI的核心原因,并自然地引出了“囊中羞涩”这个略显幽默的自嘲。
  2. 词语优化

    • 将“免费的智谱”优化为“智谱AI”或“智谱AI(因为它不仅功能强大...)”,表述更完整、专业。
    • 将“通过免费使用”优化为“提供了免费使用的渠道”或“慷慨的免费使用政策”,语言更书面化。
    • 将“遮蔽我的囊中羞涩”这个略显生硬的表达,优化为“遮蔽我囊中羞涩的现实”或“体面地遮掩囊中羞涩,免于为高昂费用而烦恼”,使其在保留自嘲幽默感的同时,表达更加流畅、自然且易于理解。
  3. 风格统一:两个版本都保持了原文作为个人测试页面的随笔风格,但提升了语言的专业度和流畅度,使表达更加得体。您可以根据自己的偏好选择其一。

Unsplash API 额度申请与使用经验总结

1. 成功申请每小时5000次请求额度

经过多次尝试,我终于成功申请到了 Unsplash API 每小时5000次的请求额度。此前申请未能通过,可能是由于翻译质量或代码示例不够完善所致。

2. 申请过程中的关键发现

在开发 Unsplash 插件的过程中,我重新提交了申请,并仔细阅读了官方文档,终于明确了申请所需的关键要素。

2.1 图片展示要求

根据 Unsplash 的规定,使用其 API 获取的图片在展示时必须包含摄影师信息和图片来源声明,格式应为:

Photo by [摄影师姓名] on Unsplash

2.2 插件自动生成功能

我开发的插件在插入照片时能够自动生成上述必需的信息。不过,在尝试将元数据写入照片 EXIF 信息时遇到了技术障碍,目前尚未成功。

3. 申请界面注意事项

3.1 申请材料截图示例

以下是申请过程中需要准备的界面截图:

申请界面截图

Unsplash 相关界面

申请材料示例

3.2 重要提示

特别注意:在申请过程中,不要随意勾选下图所示的选项,除非你完全理解其含义并确实需要:

注意事项提示

4. 总结

本次申请成功的关键在于:

  1. 仔细阅读官方文档要求
  2. 提供清晰、符合规范的代码示例
  3. 确保应用符合 Unsplash 的 attribution 要求
  4. 避免随意勾选不理解的选项

通过这次经历,我对 Unsplash API 的使用规范有了更深入的理解,也为后续的插件开发奠定了良好基础。


在用AI搓了unsplash插件后,又继续想搓一个灯箱的插件。想法是这样的在使用unsplash图片的时候会完整显示

exif的信息,在普通图片没有exif信息的时候则不显示。

灯箱里面的功能必须要显示照片的数量,上一张下一张切换的按钮,双击的时候以鼠标为中心放大,可以自由拖动图片。

鼠标的滚轮可以放大或者缩小图片。然而显示是残忍的在获取unsplash图片ID的时候总是出错。看来我需要好好的研究

这个功能。

下一个想弄的是用AI来给文章润色和总结。目前的逻辑是用的首页的所有图片。我不知道是用所有图片,还是只要单独的

文章图片更好。

我觉得这两个插件特别适合在使用unsplash的摄影师或者和摄影相关使用unsplash的博客。
屏幕截图 2026-01-26 223614.png


这是一篇测试文章,用来测试unsplash的插件弄得图片。

在被AI反复要修改后这是最后的效果图,因为要符合unsplash的api规定所以ai要求高。

不仅是插件安全方面,比如api泄露风险还是api的使用规定上面,ai都帮我考虑到。

连细节链接要什么格式都会帮我做。很遗憾的就是对中文支持不是很好。
yellow flower in black background

Photo by Amanda Kloska on Unsplash

A view of the great wall of china

Photo by Chawy on Unsplash

a close up of a green leaf with drops of water on it

Photo by Clay Banks on Unsplash