---
title: "使用 Cloudflare Worker 加速 GitHub CDN 访问"
date: 2023-09-26T19:15:46.000Z
author: Z.SHINCHVEN
tags: [Cloudflare, GitHub, CDN, Cloudflare Worker]
canonical: https://atlassc.net/2023/09/27/github-cdn-proxy-over-cloudflare-workers
---
<p style="display: flex; justify-content: center;">
  <img src="https://blogimgs.atlassc.net/images/github/cloudflare-github.webp" alt="GitHub Cloudflare" style="max-width: 100%; height: auto;" />
</p>

GitHub是开发者社区中最大的代码托管平台之一，但在某些地区，由于网络限制和访问速度问题，访问 GitHub 的速度可能会受到影响。幸运的是，你可以使用 Cloudflare Worker 来改善 GitHub 的访问速度，尤其是针对其内容分发网络（CDN）上的文件。在本文中，我们将介绍如何设置一个 Cloudflare Worker 来缓解这些问题。

## 什么是 Cloudflare Worker？

Cloudflare Worker 是一个运行在全球分布式网络中的服务器端代码环境，它允许你在网络请求进入 Cloudflare 边缘节点时执行自定义代码。这意味着你可以在接近用户的地方运行代码，从而加速响应时间，减少网络延迟，并提供更好的用户体验。

## 使用 Cloudflare Worker 加速 GitHub CDN

在这里，我们将展示如何使用 Cloudflare Worker 来加速 GitHub CDN 的访问，特别是 GitHub 仓库中的发布文件和原始文件。我们将创建一个 Worker，使其能够代理 GitHub CDN 请求，并在必要时从 GitHub 获取文件。

### 步骤1：创建 Cloudflare Worker

首先，你需要一个 Cloudflare 帐户和一个域名。登录到 Cloudflare 控制台，然后选择你的域名。在 "Workers" 部分，创建一个新的 Worker，并将其绑定到你的域名。

### 步骤2：编写 Worker 代码

在 Worker 设置中，你需要编写自定义代码，用于处理 GitHub CDN 请求。以下是一个示例代码：

```JavaScript
// 监听 'fetch' 事件，并使用 'handleRequest' 函数的结果来响应请求
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

// 定义 GitHub 和 raw GitHub 域名的常量
const GITHUB_DOMAIN = 'https://github.com'
const RAW_GITHUB_DOMAIN = 'https://raw.githubusercontent.com'

// 定义用于匹配 GitHub 和 raw GitHub 内容的允许路径的正则表达式
const allowedGithubPath = /^\/[^\/]+\/[^\/]+\/releases\/download\/.*/;
const allowedRawPath = /^\/raw\/[^\/]+\/[^\/]+\/[^\/]+\/.*/;

// 定义 'handleRequest' 函数来处理传入的请求
async function handleRequest(request) {
  const url = new URL(request.url)
  let path = url.pathname

  let githubDomain;
  // 检查路径是否与允许的 GitHub 内容路径匹配
  if (allowedGithubPath.test(path)) {
    githubDomain = GITHUB_DOMAIN;
  } else if (allowedRawPath.test(path)) {
    // 如果路径与允许的 raw GitHub 内容路径匹配，使用 raw GitHub 域名，并从路径中移除 '/raw' 前缀
    githubDomain = RAW_GITHUB_DOMAIN;
    path = path.replace('/raw', '');
  } else {
    // 如果路径无效，返回 '403 Forbidden' 响应
    return new Response('无效的路径', { status: 403 })
  }

  // 通过连接域名和路径来构造 GitHub URL
  const githubUrl = githubDomain + path
  // 使用 'fetch' 函数获取 GitHub URL 的内容
  let githubResponse = await fetch(githubUrl, request)

  // 跟随重定向直到获得最终响应
  while (githubResponse.status >= 300 && githubResponse.status < 400) {
    const location = githubResponse.headers.get('Location')
    githubResponse = await fetch(location, request)
  }

  // 将响应数据作为 ArrayBuffer 获取
  const data = await githubResponse.arrayBuffer()

  // 使用来自 GitHub 响应的数据构造 'Response' 对象并返回
  const response = new Response(data, {
    status: githubResponse.status,
    statusText: githubResponse.statusText,
    headers: githubResponse.headers
  })

  return response
}
```

### 步骤3：部署 Worker

一旦你编写了 Worker 代码，点击保存并部署 Worker。Cloudflare 将自动将 Worker 部署到其全球网络中，以便它可以在边缘节点上运行。

### 步骤4：配置路由

最后，你需要配置路由，以确定哪些请求将被 Worker 处理。在 Cloudflare 控制台中的 Worker 设置中，配置适当的路由规则，以便 Worker 可以拦截 GitHub CDN 请求并加速它们。

现在，你已经设置好了 Cloudflare Worker，可以开始享受更快的 GitHub CDN 访问了。Worker 将代理 GitHub 请求，并从 Cloudflare 边缘节点提供更快的响应，从而提高了用户体验。

### 步骤4：绑定域名

Cloudflare Workers 默认提供一个类似于 `your-worker-name.your-worker-subdomain.workers.dev` 的域名，但在某些情况下，这个默认域名可能会受到网络限制，导致无法直连。为了解决这个问题，我们建议将 Cloudflare Worker 绑定到你自己的域名。

以下是如何将 Cloudflare Worker 绑定到自己的域名的步骤：

1. **登录 Cloudflare 控制台：** 首先，登录到你的 Cloudflare 帐户。

2. **选择域名：** 在 Cloudflare 控制台中，选择你想要绑定 Worker 的域名。确保你的域名已经添加到 Cloudflare 并配置了正确的 DNS 设置。

3. **进入 Cloudflare Worker 详情页面：** 在域名的概览页面，找到 "Workers" 部分，并点击 "Manage Workers" 或类似的选项。这将带你进入 Cloudflare Workers 的管理页面。

4. **找到 Trigger 页：** 在 Cloudflare Worker 管理页面中，寻找 "Trigger" 或 "触发器" 选项。这通常位于左侧菜单中。

5. **绑定域名：** 在 Trigger 页面，你将看到一个选项，允许你选择将 Worker 绑定到哪个域名。选择你希望用于加速 GitHub CDN 访问的域名，并保存设置。

一旦你成功将 Cloudflare Worker 绑定到你的域名，Worker 将能够在你的自定义域名上运行，从而保证了访问的稳定性。这意味着用户将能够通过你的域名直接访问 GitHub CDN，而不受到默认域名可能存在的限制。

## 总结

使用 Cloudflare Worker 来加速 GitHub CDN 访问是一个有效的方法，特别是在网络受限或速度较慢的情况下。通过将代码运行在全球分布式网络中，你可以减少延迟，提高性能，从而更快地获取 GitHub 仓库中的文件。希望本文对你有所帮助，让你更好地利用 GitHub 的资源。
