使用cloudflare workers反代github

如果你懒

我做了一个镜像站,自取不谢。

如果你吃饱了撑着

就跟我一起做。

打开 cloudflare

pApPLZV.png
这一步不会有人不会吧

菜单下拉点击 Workers 和 Pages(如果你是简体中文的话),

pApPOaT.png

我这里已经创建过一个了,点击 创建

pApP7Mn.png

没创建过就是这样子,点击 创建 Worker

pApPHrq.png

这里不用管直接点击 部署。我懒得在建一个直接看建过的也一样。

pApPbq0.png

点击 编辑代码。进去等代码加载好。

pApPviF.png

把代码改成这个样子:

const upstream = 'github.com'
const upstream_path = '/'
const upstream_mobile = 'github.com'
const blocked_region = ['KP', 'SY', 'PK', 'CU']
const blocked_ip_address = ['0.0.0.0', '127.0.0.1']
const https = true
const replace_dict = {'$upstream': '$custom_domain', '//github.com': ''}
addEventListener('fetch', event => {
  event.respondWith(fetchAndApply(event.request))
})
 
async function fetchAndApply(request) {
  const region = request.headers.get('cf-ipcountry').toUpperCase()
  const ip_address = request.headers.get('cf-connecting-ip')
  const user_agent = request.headers.get('user-agent')
 
  let response = null
  let url = new URL(request.url)
  let url_hostname = url.hostname
 
  if (https == true) {
    url.protocol = 'https:'
  } else {
    url.protocol = 'http:'
  }
 
  if (await device_status(user_agent)) {
    var upstream_domain = upstream
  } else {
    var upstream_domain = upstream_mobile
  }
 
  url.host = upstream_domain
  if (url.pathname == '/') {
    url.pathname = upstream_path
  } else {
    url.pathname = upstream_path + url.pathname
  }
 
  if (blocked_region.includes(region)) {
    response = new Response('Access denied: WorkersProxy is not available in your region yet.', {
      status: 403
    })
  } else if (blocked_ip_address.includes(ip_address)) {
    response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', {
      status: 403
    })
  } else {
    let method = request.method
    let request_headers = request.headers
    let new_request_headers = new Headers(request_headers)
 
    new_request_headers.set('Host', url.hostname)
    new_request_headers.set('Referer', url.hostname)
 
    let original_response = await fetch(url.href, {
            method: method,
            headers: new_request_headers
    })
 
    let original_response_clone = original_response.clone()
    let original_text = null
    let response_headers = original_response.headers
    let new_response_headers = new Headers(response_headers)
    let status = original_response.status
 
    new_response_headers.set('access-control-allow-origin', '*')
    new_response_headers.set('access-control-allow-credentials', true)
    new_response_headers.delete('content-security-policy')
    new_response_headers.delete('content-security-policy-report-only')
    new_response_headers.delete('clear-site-data')
    
    const content_type = new_response_headers.get('content-type')
    if (content_type.includes('text/html') && content_type.includes('UTF-8')) {
      original_text = await replace_response_text(original_response_clone, upstream_domain, url_hostname)
    } else {
      original_text = original_response_clone.body
    }
 
    response = new Response(original_text, {
      status,
      headers: new_response_headers
    })
  }
  return response
}
 
async function replace_response_text(response, upstream_domain, host_name) {
  let text = await response.text()
 
  var i, j
  for (i in replace_dict) {
    j = replace_dict[i]
 
    if (i == '$upstream') {
      i = upstream_domain
    } else if (i == '$custom_domain') {
      i = host_name
    }
 
    if (j == '$upstream') {
      j = upstream_domain
    } else if (j == '$custom_domain') {
      j = host_name
    }
 
    let re = new RegExp(i, 'g')
    text = text.replace(re, j)
  }
  return text
}
 
async function device_status(user_agent_info) {
  var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]
  var flag = true
  for (var v = 0; v < agents.length; v++) {
    if (user_agent_info.indexOf(agents[v]) > 0) {
      flag = false
      break
    }
  }
  return flag
}

点击 部署 即可。然后你就会发现这些链接都打不开。

你可以自定义一个域名,前提是你有域名,我推荐去 register.us.kg,免费注册域名。

域名注册

首先你得注册一个账号吧。

我这里排版有点乱不过没关系。这些个人信息你可以去这个网站生成一个。

像我就是这样

把这些信息像我这样填进去。邮箱用自己的,填完不要丢,这些名字、电话号码、街道什么的还要用。

这边邮箱填错了,后来我改回自己的邮箱了。

注意街道需要有两个英文逗号,电话号码去掉 - 加上前缀 +1-

这边人机验证后注册,去收邮件,登录。

这里点击选择框,选择最下面的。

点击 Proceed to Default Server (Click me to redirect KYC Page)

注册原因填 setup a website 做一个网站。下面一个空填 work ID

还记得我让你记住身份吗?随便去一个比如说洛谷云剪贴板,总之就是可以打字并且背景是白色的地方。

像我这样截图,上传,点击 submit

回到主站,你就会发现登录好了。

点击左侧菜单栏的 Domain Registration,输入你想要的域名,点击 check,如果没有被人注册,就是这个样子。

前往 dash.cloudflare.com。点击右上角的 添加站点。把域名输入进去。

计划选择免费,因为我没钱,DNS 记录先不用管,一路继续,到了这个地方。

把两个服务器复制下来,粘贴到刚刚的 register.us.kg。

点击 Register 就好了。这个域名可以给你用一年,你可以在离到期还有 \(180\) 天的时候免费续订。就是在 Dashboard -> Manage my domains 点击你要续订的域名,下拉点击 Renew (if there's less than 180 days left until expiry) 即可。

回到 cloudflare,点击 设置 -> 触发器,点击 添加自定义域,输入你的域名,最后点击 添加自定义域 就好了。

pApPXIU.png

可能你会发现你的证书还不是有效的,不要慌,过一会就好了。

打开我们的域,可以发现下载什么的也是完全可用……吧。

pApPxG4.png

只是偶尔有些慢而已。

参考:

  1. 2024两种永久免费域名,手快有手慢无,可托管CF,零失败率,解决所有问题

  2. 利用Cloudflare workers反代github

posted @ 2024-08-13 21:08  volatiles  阅读(868)  评论(0)    收藏  举报