github-proxy是一个部署在 Cloudflare Workers 的 GitHub 代理服务,适合个人或小团队使用,底层路由逻辑基于 hunshcn/gh-proxy 重构。如有大需求请参考原项目另外的部署方式。- 修改原因:把一些常用的网站交由自己把控,避免不稳定等情况(不想看到广告)。
- 单文件部署,操作简单。
- 主要用于解决 GitHub 资源加载缓慢、API 速率限制以及前端跨域(CORS)拦截等问题。
- 访问首页即为一个可视化转换工具:粘贴链接 → 实时得到代理地址 → 一键复制 / 下载。
- 部署前,可以在
index.js文件顶部根据自己的需求修改配置常量。
// 1. 路径前缀(默认 '/',即 https://你的域名/)
// 想用子路径(如 https://你的域名/proxy/)则改为 '/proxy/'
const PREFIX = '/'
// 2. 最大文件代理大小限制(字节)。0 表示无限制。
// 超过上限时自动 302 重定向到原始地址(原链接)。
const MAX_FILE_SIZE = 0
// 3. 短链基准地址。支持「单个字符串」或「字符串数组」,留空('')关闭。
const CUSTOM_BASE_URL = ''
// const CUSTOM_BASE_URL = 'https://github.com/用户名/仓库名/分支名/'
// const CUSTOM_BASE_URL = [
// 'https://github.com/用户名/仓库名/分支名/',
// 'https://raw.githubusercontent.com/用户名/仓库名/分支名/'
// ]
// 4. 自定义可反代的网站(域名,支持 '*.example.com' 通配)
const CUSTOM_PROXY_SITES = []
// 5. 代理 HTML 内容时的同源防护:'sandbox' | 'download' | 'off'
const HTML_GUARD = 'sandbox'- 触发条件:
MAX_FILE_SIZE > 0,且上游响应携带content-length头,且该值大于上限。 - 返回形式:
302 Found重定向,Location指向原始地址(原链接),请求被交还上游直连; 同时附带响应头X-Proxy-Fallback: size-exceeded与Cache-Control: no-store,便于识别并避免缓存。 - 未超限:正常透传,行为不变。
- 注意:若上游未返回
content-length(例如分块传输),则无法预先判断大小,此时不做拦截。
支持单个字符串(原有写法,完全兼容)与字符串数组(多地址)两种写法,值会自动补上结尾的 /。
取值方式
- 访问
https://你的域名/剩余文件名(即路径不足以判定为 GitHub 路径时),会把剩余文件名拼接到基准地址之后。 - 单字符串:等价于只含一个元素的数组。
- 数组:元素即为候选基准地址,按数组顺序使用;空白项会被自动忽略。
使用方式(多地址回退)
| 请求方法 | 行为 |
|---|---|
GET / HEAD |
按顺序依次请求各候选地址;当上游返回 404 或 5xx 时自动尝试下一个;取第一个可用结果。全部失败则返回最后一个地址的响应。 |
| 其他方法(POST/PUT 等) | 只请求第一个候选地址(避免请求体被重复消费)。 |
示例
- 原链接:
https://github.com/用户名/仓库名/分支名/剩余文件名 - 配置:
'https://github.com/用户名/仓库名/分支名/' - 即可以此访问:
https://你的域名/剩余文件名 - 配置多个镜像时,主地址不可用会自动切到备用地址,无需客户端改动。
安全提示:短链基准地址所在的域名会被自动视为受信域名,因此请只填写你信任的地址。
- 填入域名后,即可通过
https://你的域名/example.com/路径反代该站点。 - 支持
*.example.com通配子域。 - 只有内置 GitHub 域名与本列表中的域名可被反代,避免服务沦为开放代理。
- 首页转换工具会自动区分两类域名:内置 GitHub 域名会去掉主机前缀(
github.com/u/r/...→你的域名/u/r/...), 而自定义站点会保留host/路径(example.com/a→你的域名/example.com/a),因为服务端需要靠路径首段来判断该反代哪个站点。
被反代的第三方 HTML 是在本 Worker 的域名下渲染的,若原样放行,其内联脚本即获得本域执行权限,构成 XSS / Cookie 窃取面。因此对 content-type: text/html 的响应额外加一层防护:
| 取值 | 行为 | 适用 |
|---|---|---|
'sandbox'(默认) |
追加 Content-Security-Policy: sandbox,页面可预览,但禁止脚本、表单提交与顶层跳转 |
只读预览场景 |
'download' |
追加 Content-Disposition: attachment,直接下载而非在浏览器渲染 |
只想当下载站 |
'off' |
不做任何处理 | 需要完整渲染第三方页面(风险自负) |
只对
text/html生效;二进制、纯文本、JSON 等响应一律不干预。
在不改变反向代理语义的前提下,服务内置以下防护:
| 措施 | 具体做法 | 作用范围 |
|---|---|---|
| 目标地址二次校验 | 解析最终目标 URL,要求协议为 https 且 hostname 落在受信域名集合(可反代域名 + 短链基准域名)内,否则返回 400 |
全部代理请求;可拦截 https://github.com@evil.com/x 这类 userinfo 混淆写法 |
| 重定向收敛 | 受信域名 → 重写回本 Worker 继续代理;GitHub 资源 CDN(objects.githubusercontent.com 等)→ 服务端跟随;其余目标 → 原样回传客户端,不做服务端跟随 |
上游 302 处理,防止服务端被诱导请求任意外部地址(SSRF) |
| 请求头净化 | 转发前剔除 host、cookie、connection、keep-alive、transfer-encoding、upgrade、te、trailer、proxy-*,以及 cf-connecting-ip、cf-ray、cf-visitor、x-forwarded-*、x-real-ip |
所有转发至上游的请求;authorization 会保留,私有仓库 / Token 访问不受影响 |
| 出站域名白名单 | 仅内置 GitHub 域名、CUSTOM_PROXY_SITES 与短链基准域名可出站 |
从源头消除「开放代理」与内网探测风险 |
| 强制 HTTPS | 目标地址一律以 https:// 构造 |
全链路 |
| 响应头加固 | 补充 referrer-policy: no-referrer;保留 x-frame-options: DENY、x-content-type-options: nosniff;移除上游的 CSP 与 clear-site-data |
所有代理响应 |
| HTML 同源防护 | 对 text/html 响应追加 Content-Security-Policy: sandbox(或按 HTML_GUARD 改为下载 / 不处理) |
见「HTML 同源防护」一节 |
| 错误信息收敛 | 上游 404 / 5xx 只回状态码,不回显上游地址 | 所有错误响应 |
已知的行为变化(均为安全收敛,如确有需要可在源码中调整):
- 客户端
cookie不再转发给上游。 - 指向不受信域名的上游重定向不再由服务端跟随,而是直接交还客户端。
首页为纯前端实现的可视化转换工具,与后端逻辑解耦,仅通过同域路径访问:
- 实时转换:输入目标地址即实时生成代理地址,支持
github.com、raw.githubusercontent.com、gist 等链接以及user/repo短形式。 - 仓库跳转:当输入可识别出所属仓库时,结果区会展示可点击的仓库链接(指向
https://github.com/所有者/仓库名)。点击后以新窗口打开;若新窗口被浏览器拦截或打开失败,会在页面底部给出提示。 - 一键操作:支持复制代理地址、直接打开 / 下载,以及
Enter打开、Esc清空等键盘操作。 - 主题与无障碍:支持浅色 / 深色主题切换并记忆偏好;适配
prefers-reduced-motion,并保证文本对比度满足 WCAG AA。
- 登录 Cloudflare 控制台。
- 导航至
Workers 和 Pages,点击创建应用程序->创建 Worker。 - 设定项目名称并点击
部署。 - 点击
编辑代码,清空编辑器内的所有默认代码。 - 将本项目中的
index.js完整代码复制并粘贴到左侧编辑器中。 - 点击右上角
保存并部署。 - 在
域页面可以找到默认生成的workers.dev访问链接。建议在此页面添加自定义域以防默认域名被 DNS 污染,并关闭默认生成的workers.dev访问权限。
运行于 Cloudflare 免费生态:
- 每日请求上限:100,000 次。
- 并发速率限制:1,000 次 / 分钟。
本项目基于 MIT License 开源,详见 LICENSE。