解决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)
|