5分钟快速搭建 GitHub 加速站(Cloudflare Workers 方案)

🚀 5分钟快速搭建 GitHub 加速站(Cloudflare Workers 方案)

《🚀 5分钟快速搭建 GitHub 加速站(Cloudflare Workers 版)》——排版清晰,逻辑更流畅,适合用于发布到博客、公众号或技术网站:


📖 前言

还在为 GitHub 下载速度太慢、经常连接失败而烦恼吗?通过 Cloudflare Workers + gh-proxy,你可以快速搭建属于自己的 GitHub 下载加速站,免费、稳定、速度快!只需 5分钟,即可完成部署。示例演示:github加速站


☁️ 一、原理简介

本加速站基于:

  • Cloudflare Workers:Cloudflare 提供的 Serverless 计算平台(每天 10 万免费请求);
  • gh-proxy 项目:GitHub Releases、项目文件、Gist 等下载加速代理;

通过 JS 代码部署在 Cloudflare 上,实现 GitHub 文件的镜像加速。


🛠️ 二、部署流程

✅ 1. 注册 Cloudflare 并登录

访问:https://dash.cloudflare.com/

如果你已有账户可跳过,建议使用 GitHub 或邮箱注册。


✅ 2. 创建 Workers 服务

  1. 点击左侧菜单 “Workers & Pages”
  2. 点击右上角 “Create Application”;
  3. 选择 Workers → “Create Worker”;
  4. 填写名称(如:github-proxy),点击 “Deploy”。

✅ 3. 编辑 Worker 脚本

部署后进入快速编辑页面:

  1. 左侧是默认代码区域,全选删除
  2. 将以下完整代码复制粘贴进去:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// --- GitHub Proxy Worker 脚本 --- //
'use strict'
const ASSET_URL = 'https://hunshcn.github.io/gh-proxy/'
const PREFIX = '/'
const Config = { jsdelivr: 1, cnpmjs: 1 }

const PREFLIGHT_INIT = {
status: 204,
headers: new Headers({
'access-control-allow-origin': '*',
'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
'access-control-max-age': '1728000',
}),
}

const exp1 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:releases|archive)\/.*$/i
const exp2 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:blob|raw)\/.*$/i
const exp3 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/(?:info|git-).*$/i
const exp4 = /^(?:https?:\/\/)?raw\.(?:githubusercontent|github)\.com\/.+?\/.+?\/.+?\/.+$/i
const exp5 = /^(?:https?:\/\/)?gist\.(?:githubusercontent|github)\.com\/.+?\/.+?\/.+$/i
const exp6 = /^(?:https?:\/\/)?github\.com\/.+?\/.+?\/tags.*$/i

function makeRes(body, status = 200, headers = {}) {
headers['access-control-allow-origin'] = '*'
return new Response(body, {status, headers})
}

function newUrl(urlStr) {
try { return new URL(urlStr) } catch { return null }
}

addEventListener('fetch', e => {
const ret = fetchHandler(e).catch(err => makeRes('cfworker error:\n' + err.stack, 502))
e.respondWith(ret)
})

function checkUrl(u) {
return [exp1, exp2, exp3, exp4, exp5, exp6].some(exp => u.search(exp) === 0)
}

async function fetchHandler(e) {
const req = e.request
const urlObj = new URL(req.url)
let path = urlObj.searchParams.get('q')

if (path) return Response.redirect('https://' + urlObj.host + PREFIX + path, 301)
path = urlObj.href.substr(urlObj.origin.length + PREFIX.length).replace(/^https?:\/+/, 'https://')

if (path.search(exp1) === 0 || path.search(exp5) === 0 || path.search(exp6) === 0 || (!Config.cnpmjs && (path.search(exp3) === 0 || path.search(exp4) === 0))) {
return httpHandler(req, path)
} else if (path.search(exp2) === 0) {
if (Config.jsdelivr) {
const newUrl = path.replace('/blob/', '@').replace(/^https?:\/\/github\.com/, 'https://cdn.jsdelivr.net/gh')
return Response.redirect(newUrl, 302)
} else {
path = path.replace('/blob/', '/raw/')
return httpHandler(req, path)
}
} else if (path.search(exp3) === 0) {
const newUrl = path.replace(/^https?:\/\/github\.com/, 'https://github.com.cnpmjs.org')
return Response.redirect(newUrl, 302)
} else if (path.search(exp4) === 0) {
const newUrl = path.replace(/(?<=com\/.+?\/.+?)\/(.+?\/)/, '@$1').replace(/^https?:\/\/raw\.(?:githubusercontent|github)\.com/, 'https://cdn.jsdelivr.net/gh')
return Response.redirect(newUrl, 302)
} else {
return fetch(ASSET_URL + path)
}
}

function httpHandler(req, pathname) {
if (req.method === 'OPTIONS' && req.headers.has('access-control-request-headers')) {
return new Response(null, PREFLIGHT_INIT)
}

const reqInit = {
method: req.method,
headers: new Headers(req.headers),
redirect: 'manual',
body: req.body
}

if (pathname.startsWith('github')) pathname = 'https://' + pathname
const urlObj = newUrl(pathname)
return proxy(urlObj, reqInit)
}

async function proxy(urlObj, reqInit) {
const res = await fetch(urlObj.href, reqInit)
const newHeaders = new Headers(res.headers)

if (newHeaders.has('location')) {
let loc = newHeaders.get('location')
if (checkUrl(loc)) newHeaders.set('location', PREFIX + loc)
else {
reqInit.redirect = 'follow'
return proxy(newUrl(loc), reqInit)
}
}

newHeaders.set('access-control-expose-headers', '*')
newHeaders.set('access-control-allow-origin', '*')
newHeaders.delete('content-security-policy')
newHeaders.delete('content-security-policy-report-only')
newHeaders.delete('clear-site-data')

return new Response(res.body, {status: res.status, headers: newHeaders})
}
  1. 点击右上角 “Save and Deploy”

🌐 四、使用方式

部署成功后,会自动分配一个 Worker 地址,如:

1
https://proxygithub.xxx.workers.dev/

你可以直接在链接前加上你的 Worker 地址访问 GitHub 文件,例如:

1
https://proxygithub.xxx.workers.dev/https://github.com/xxx/xxx/releases/download/xxx/xxx.zip

也可以做一个 HTML 页面来说明加速用途。


🌍 五、自定义域名(可选)

如果你希望使用自定义域名(如 gitproxy.yoursite.com)来访问:

  1. 把域名托管到 Cloudflare;
  2. 添加一个子域名(比如 gitproxy);
  3. 在 Cloudflare Workers 中添加路由:
    gitproxy.yoursite.com/* → 映射到你刚才的 Worker 服务

这样你就可以通过:

1
https://gitproxy.yoursite.com/https://github.com/...

来访问你的加速服务了。

📚 六、相关项目参考


📝 总结

这个 GitHub 加速方案无需服务器,无需额外花费,几分钟即可部署完成,推荐收藏!
以后遇到 GitHub 下载慢、打不开页面的情况,直接把链接前加上你的加速地址即可轻松访问。

示例用法:

1
https://proxygithub.xxx.workers.dev/https://github.com/user/repo/releases/download/v1.0/file.zip