教程

基于github托管图片

TIP

请不要过度滥用这个项目,仅提供思路。

之前就在想解决图床的问题,使用第三方图床的话会有失效的风险,毕竟不是存储在自己的服务器上,那么有没有什么解决办法呢?

兄弟有的有的,经过我的探索,我发现完全可以将图片直接放到github仓库上,白嫖GitHub。

本站使用的是基于Astro的博客,项目本身就是托管在gh上的,所以我在项目的根目录下创建了一个image文件夹,用来存放图片。

这样push后就将图片一并传到gh上了,在自己的仓库中可以找到图片的直链地址, 例如我的某张图片的url就是https://raw.githubusercontent.com/Flygeon/Astro/refs/heads/main/image/6-cover.png

反代图片

但是这个方法有个很大的问题,由于天朝网络的因素,国内访问就和窜西一样时好时坏,所以我们还需要构建一个反代项目来解决这个问题。这点可以通过大善人Cloudflare来实现。

新建一个Cloudflare Pages项目就够了,不需要挤占Workers资源。 新建一个_worker.js文件,往里面填充如下代码:

// _worker.js - 完整的 raw.githubusercontent.com 反向代理
// 部署到 Cloudflare Pages 即可使用

// 配置区域(可根据需要修改)
const TARGET_HOST = "raw.githubusercontent.com";      // 目标主机
const ENABLE_CORS = true;                             // 是否启用跨域资源共享
const ENABLE_CACHE = true;                            // 是否启用缓存(默认缓存 1 天)
const CACHE_TTL = 86400;                              // 缓存时间(秒),默认 1 天
const ALLOWED_REFERERS = [];                          // 防盗链白名单,留空则不检查,例如 ["https://yourdomain.com"]

export default {
  async fetch(request, env, ctx) {
    try {
      // 1. 防盗链检查(可选)
      if (ALLOWED_REFERERS.length > 0) {
        const referer = request.headers.get("Referer");
        if (referer) {
          let isAllowed = false;
          for (const allowed of ALLOWED_REFERERS) {
            if (referer.startsWith(allowed)) {
              isAllowed = true;
              break;
            }
          }
          if (!isAllowed) {
            return new Response("Forbidden", { status: 403 });
          }
        }
      }

      // 2. 构建目标 URL
      let url = new URL(request.url);
      url.protocol = "https";
      url.hostname = TARGET_HOST;
      // 保持原始路径、查询参数不变

      // 3. 创建新的请求,复制原始请求的方法、头、正文
      let newRequest = new Request(url, {
        method: request.method,
        headers: request.headers,
        body: request.body,
        // 保留请求的 duplex 属性(用于流式传输)
        duplex: "half"
      });

      // 4. 发送请求到 GitHub raw 服务器
      let response = await fetch(newRequest);

      // 5. 准备响应头(复制原始响应头并修改)
      let responseHeaders = new Headers(response.headers);

      // 6. 启用 CORS(跨域资源共享)
      if (ENABLE_CORS) {
        responseHeaders.set("Access-Control-Allow-Origin", "*");
        responseHeaders.set("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS");
        responseHeaders.set("Access-Control-Allow-Headers", "Content-Type");
        // 处理预检请求(OPTIONS)
        if (request.method === "OPTIONS") {
          return new Response(null, {
            status: 204,
            headers: responseHeaders
          });
        }
      }

      // 7. 启用缓存(通过 Cache-Control 头)
      if (ENABLE_CACHE && response.status === 200) {
        // 如果原始响应没有 Cache-Control,则添加
        if (!responseHeaders.has("Cache-Control")) {
          responseHeaders.set("Cache-Control", `public, max-age=${CACHE_TTL}`);
        }
      }

      // 8. 可选:隐藏代理标识(假装自己是原始服务器)
      responseHeaders.set("Via", "");               // 移除 Via 头
      responseHeaders.delete("CF-Cache-Status");    // 移除 Cloudflare 特有头

      // 9. 返回最终响应
      return new Response(response.body, {
        status: response.status,
        statusText: response.statusText,
        headers: responseHeaders
      });

    } catch (error) {
      // 错误处理:返回 500 错误信息
      return new Response(`Proxy Error: ${error.message}`, { status: 500 });
    }
  }
};

然后自定义你的域名,测试一下访问,All done.

继续阅读

对 Bangumi 反向代理,解决大陆地区访问问题相关
对 Bangumi 反向代理,解决大陆地区访问问题

使用 Cloudflare Workers 搭建 Bangumi 反向代理,解决大陆地区访问困难的问题。

教程2026-05-30
相关
介绍Filebase免费对象存储,以及快速搭建图床教程

本文主要介绍Filebase这个新的免费对象存储平台提供5 GB的免费存储空间,兼容S3端点,非常适合搭建图床服务

有趣的项目2026-07-27
哎我去这个Pages CMS真神了相关
哎我去这个Pages CMS真神了

通过向你的静态博客仓库导入Pages CMS实现在浏览器里优雅地管理你的文章

教程2026-07-04
使用 AI 推理一键获取人声 MIDI:Vocal2Midi 项目体验随机
使用 AI 推理一键获取人声 MIDI:Vocal2Midi 项目体验

基于 Qwen3-ASR 与 GAME 模型的人声转 MIDI 工具 Vocal2Midi 体验分享,支持一键生成 MIDI / USTX / 对齐辅助文件,适配 UTAU、Vocaloid 等虚拟歌姬工作流。

有趣的项目2026-06-06
随机
今天是伟大的0721日,别忘了0721

私のOOニ一よ見てください!

分享2026-07-21
随机
记一次导航栏栏无法展开二级菜单的bug修复

屎山代码发力了,排查半天发现压根不是导航栏的问题,真凶另有其人

折腾记录2026-07-22