解决Github或Github pages 无法访问
本方法来源于网络! 作为开发者,经常使用借助GitHub进行开发,但是最近防火墙发力导致本就半死不活的GitHub在河北彻底无法访问github.com站点,所以以下几个办法供参考【ps:不考虑科学上网】 1.修改hosts 打开 http://tool.chinaz.com/dns?type=1&host=www.github.com&ip=选择一个TTL最小的ip,比如我这里是新加坡的ip 之后打开这个路径C:WindowsSystem32driversetc找到hosts,将它复制一份到桌面 通过你的文本编辑器打开这个文件,并输入一行记录13.229.188.59 github.com,同理,如果需要 assets-cdn.github.com[CSS,JS加载慢,添加这个],avatars0.githubusercontent.com[用户头像不能访问,或者访问慢],avatars1.githubusercontent.com[用户头像不能访问,或者访问慢],使用上面的方法找到dns域名,填入即可。 这种方法并不是一劳永逸的,因为nds时刻在变,所以一旦不能访问,还是先找可访问的dns域名吧。 2.Cloudflare Workers 反代 利用Cloudflare Workers搭建一个GitHub镜像供自己使用 在 cloudflare 上创建一个 worker 将下面所有内容拷贝,覆盖粘贴到 worker 里面,保存 - const config = {
- basic: {
- upstream: 'https://github.com/',
- mobileRedirect: 'https://github.com/',
- },
- firewall: {
- blockedRegion: ['KP', 'SY', 'PK', 'CU'],
- blockedIPAddress: [],
- scrapeShield: true,
- },
- routes: {
- TW: 'https://github.com/',
- },
- optimization: {
- cacheEverything: false,
- cacheTtl: 5,
- mirage: true,
- polish: 'off',
- minify: {
- javascript: true,
- css: true,
- html: true,
- },
- },
- };
- async function isMobile(userAgent) {
- const agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
- return agents.any((agent) => userAgent.indexOf(agent) > 0);
- }
- async function fetchAndApply(request) {
- const region = request.headers.get('cf-ipcountry') || '';
- const ipAddress = request.headers.get('cf-connecting-ip') || '';
- const userAgent = request.headers.get('user-agent') || '';
- if (region !== '' && config.firewall.blockedRegion.includes(region.toUpperCase())) {
- return new Response(
- 'Access denied: booster.js is not available in your region.',
- {
- status: 403,
- },
- );
- } if (ipAddress !== '' && config.firewall.blockedIPAddress.includes(ipAddress)) {
- return new Response(
- 'Access denied: Your IP address is blocked by booster.js.',
- {
- status: 403,
- },
- );
- }
- const requestURL = new URL(request.url);
- let upstreamURL = null;
- if (userAgent && isMobile(userAgent) === true) {
- upstreamURL = new URL(config.basic.mobileRedirect);
- } else if (region && region.toUpperCase() in config.routes) {
- upstreamURL = new URL(config.routes[region.toUpperCase()]);
- } else {
- upstreamURL = new URL(config.basic.upstream);
- }
- requestURL.protocol = upstreamURL.protocol;
- requestURL.host = upstreamURL.host;
- requestURL.pathname = upstreamURL.pathname + requestURL.pathname;
- let newRequest;
- if (request.method === 'GET' || request.method === 'HEAD') {
- newRequest = new Request(requestURL, {
- cf: {
- cacheEverything: config.optimization.cacheEverything,
- cacheTtl: config.optimization.cacheTtl,
- mirage: config.optimization.mirage,
- polish: config.optimization.polish,
- minify: config.optimization.minify,
- scrapeShield: config.firewall.scrapeShield,
- },
- method: request.method,
- headers: request.headers,
- });
- } else {
- const requestBody = await request.text();
- newRequest = new Request(requestURL, {
- cf: {
- cacheEverything: config.optimization.cacheEverything,
- cacheTtl: config.optimization.cacheTtl,
- mirage: config.optimization.mirage,
- polish: config.optimization.polish,
- minify: config.optimization.minify,
- scrapeShield: config.firewall.scrapeShield,
- },
- method: request.method,
- headers: request.headers,
- body: requestBody,
- });
- }
- const fetchedResponse = await fetch(newRequest);
- const modifiedResponseHeaders = new Headers(fetchedResponse.headers);
- if (modifiedResponseHeaders.has('x-pjax-url')) {
- const pjaxURL = new URL(modifiedResponseHeaders.get('x-pjax-url'));
- pjaxURL.protocol = requestURL.protocol;
- pjaxURL.host = requestURL.host;
- pjaxURL.pathname = pjaxURL.path.replace(requestURL.pathname, '/');
- modifiedResponseHeaders.set(
- 'x-pjax-url',
- pjaxURL.href,
- );
- }
- return new Response(
- fetchedResponse.body,
- {
- headers: modifiedResponseHeaders,
- status: fetchedResponse.status,
- statusText: fetchedResponse.statusText,
- },
- );
- }
- // eslint-disable-next-line no-restricted-globals
- addEventListener('fetch', (event) => {
- event.respondWith(fetchAndApply(event.request));
- });
之后通过worker 的子域名来访问GitHub 但是这种方法我是不大推荐的,因为这样不可以登录,也就是说不可以下载,如果想要下载则需要再新建一个worker然后输入以下代码 - addEventListener('fetch', event => {
- event.respondWith(handleRequest(event.request).catch((err) => { return new Response(err.message) }))
- })
- const html = `
- <html><head><h1 style=\"font-size:32px;font-family:verdana;color:red;\">Github直链加速下载每日10w次调用 </h1></head><body>
- <input type=\"url\" placeholder=\"url\" id=\"url\" style=\"border: 6px solid powderblue;color: blue; width: 60%; display: block;\">
- <input
- type=\"submit\" id=\"submit\" value=\"submit\"
- style=\"width: 30%; text-align: center;font-size: 18px;border: 1px solid powderblue;\"/>
- <div id=\"res\"></div>
- <a id=\"a\" href=\"\"\"></a>
- <p>
- <br>
- <br>
- <br>
- 怎么自己搭建这个界面?
- <br>
- https://scaleya.com/publication/github-download-faster-with-cloudflare-worker/
- </p>
- <script>
- document.getElementById('submit').onclick=function(){
- let url = document.getElementById('url').value;
- console.log('url: '+url);
- let a = document.getElementById('a');
- let div = document.getElementById('res');
- if(!url || !url.startsWith('http')){
- div.textContent=\"链接不合法: \"+url;
- a.style=\"display:none\";
- }else{
- div.textContent=\"\";
- let res = (new URL(window.location.href)).origin+'?url='+encodeURIComponent(url);
- a.textContent=res;
- a.href=res;
- a.style=\"\";
- }
- }
- </script>
- </body></html>`;
- /**
- * Respond to the request
- * @param {Request} request
- */
- async function handleRequest(request) {
- if (request.method === 'OPTIONS' && request.headers.has('access-control-request-headers')) {
- return new Response(null, {
- status: 204,
- headers: new Headers({
- 'access-control-allow-origin': '*',
- 'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS',
- 'access-control-allow-headers': '*',
- 'access-control-max-age': '1728000'
- }),
- })
- }
- let req_url = new URL(request.url);
- if (req_url.pathname.startsWith('/ajax/')) {//ajax
- let url = req_url.pathname.slice(6).replace(/^(https?):/+/, '$1://');
- if (!url) return new Response(\"Only For Ajax\");
- let res = await fetch(url, { method: request.method, headers: request.headers, body: request.body });
- let h = new Headers(res.headers);
- h.set('access-control-allow-origin', '*');
- h.set('access-control-expose-headers', '*');
- return new Response(res.body, { status: res.status, headers: h });
- } else if (req_url.pathname === '/') {//download
- let url = req_url.searchParams.get('url');
- if (!url) return new Response(html, { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' } });
- let res;
- if (request.headers.get('Range')) {
- res = await fetch(url, { headers: { 'Range': request.headers.get('Range') } });
- } else {
- res = await fetch(url);
- }
- let h = new Headers(res.headers);
- h.set('set-cookie', '');
- h.set('access-control-allow-origin', '*');
- h.set('access-control-expose-headers', '*');
- return new Response(res.body, {
- status: res.status,
- headers: h,
- })
- } else {
- return new Response(\"400 --\", { status: 400, headers: { 'Content-Type': 'text/html; charset=utf-8' } });
- }
- }
赞(7)
|