| 
 
 解决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-globalsaddEventListener('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) |