引言 由于网络原因,国内访问Github经常遇到各种问题。本文将带你从原理到实践,搭建一个属于自己的Github全站反向代理。
为什么不能只用透明代理? 针对Github这样的网站,我们无法仅使用一个简单的透明反向代理指向 github.com 来解决,原因有两点:
1. 外域依赖问题 Github官网有许多外域依赖,比如 raw.githubusercontent.com、avatars.githubusercontent.com 等。如果只代理主域名,这些资源请求会直接访问原站,导致加载失败。
2. 钓鱼风险 注意!直接反代主流网站后,不久你的网站就会被Cloudflare标记为钓鱼站点,因为你原封不动的克隆了人家站点并且 没有显式屏蔽登录页面。
解决方案:透明代理 + HTML覆写 核心思路 我们需要实现两个关键功能:
透明代理:将请求转发到Github服务器 HTML覆写:重写Github返回的HTML,将其中的外域改为我们自己的域 请求流程对比 原始流程:
用户 -> github.com -> raw.githubusercontent.com(被github.com请求) 代理流程:
用户 -> gh.072103.xyz -> raw-githubusercontent-com.072103.xyz(被gh.072103.xyz请求) 对于 gh.072103.xyz 的请求由代理服务转发到 github.com,而针对于 raw-githubusercontent-com.072103.xyz 的请求则转发到 raw.githubusercontent.com。
域名映射配置 你需要配置类似这样的域名映射:
const domain_mappings = { 'github.com': 'gh.', 'avatars.githubusercontent.com': 'avatars-githubusercontent-com.', 'github.githubassets.com': 'github-githubassets-com.', 'collector.github.com': 'collector-github-com.', 'api.github.com': 'api-github-com.', 'raw.githubusercontent.com': 'raw-githubusercontent-com.', 'gist.githubusercontent.com': 'gist-githubusercontent-com.', 'github.io': 'github-io.', 'assets-cdn.github.com': 'assets-cdn-github-com.', 'cdn.jsdelivr.net': 'cdn.jsdelivr-net.', 'securitylab.github.com': 'securitylab-github-com.', 'www.githubstatus.com': 'www-githubstatus-com.', 'npmjs.com': 'npmjs-com.', 'git-lfs.github.com': 'git-lfs-github-com.', 'githubusercontent.com': 'githubusercontent-com.', 'github.global.ssl.fastly.net': 'github-global-ssl-fastly-net.', 'api.npms.io': 'api-npms-io.', 'github.community': 'github-community.' }; 假如你的域名为 abc.com,你需要将以下子域名绑定到你的代理服务:
gh.abc.com avatars-githubusercontent-com.abc.com raw-githubusercontent-com.abc.com …等等 防钓鱼措施 我们需要找到原站点的所有登录页逐一屏蔽,对于Github.com,我们需要屏蔽:
...