利用Cloudflare做个免费镜像站

  • A+
所属分类:网站建设

偶然看到一个利用 Cloudflare Workers 做免费镜像站的项目,无须购买VPS了,留作备用。
项目地址:https://github.com/Siujoeng-Lau/Workers-Proxy
1、如果已经注册过Cloudflare账号,直接在Cloudflare主页左上角Products->Workers,没有就注册一个账号再重复上一步。
2、填写一个二级域名域名,方法如下图
利用Cloudflare做个免费镜像站|青衣楼
3、这样有免费版和付费版本这里我选择免费版本
利用Cloudflare做个免费镜像站|青衣楼
4、点击 Create a Worker 创建一个 Worker:
利用Cloudflare做个免费镜像站|青衣楼
5、自动生成含有 hello world 示例代码
利用Cloudflare做个免费镜像站|青衣楼
6、删除示例,拷贝下方代码,查看预览并保存部署

  1. // 代理网站.
  2. const upstream = 'www.google.com'
  3. // 代理网站的目录.
  4. const upstream_path = '/'
  5. // 手机用户代理网站.
  6. const upstream_mobile = 'www.google.com'
  7. // 屏蔽国家和地区.
  8. const blocked_region = ['KP', 'SY', 'PK', 'CU']
  9. // 屏蔽 IP 地址.
  10. const blocked_ip_address = ['0.0.0.0', '127.0.0.1']
  11. // 源站是否开启 HTTPS.
  12. const https = true
  13. // 文本替换.
  14. const replace_dict = {
  15.     '$upstream': '$custom_domain',
  16.     '//google.com': ''
  17. }
  18. addEventListener('fetch', event => {
  19.     event.respondWith(fetchAndApply(event.request));
  20. })
  21. async function fetchAndApply(request) {
  22.     const region = request.headers.get('cf-ipcountry').toUpperCase();
  23.     const ip_address = request.headers.get('cf-connecting-ip');
  24.     const user_agent = request.headers.get('user-agent');
  25.     let response = null;
  26.     let url = new URL(request.url);
  27.     let url_hostname = url.hostname;
  28.     if (https == true) {
  29.         url.protocol = 'https:';
  30.     } else {
  31.         url.protocol = 'http:';
  32.     }
  33.     if (await device_status(user_agent)) {
  34.         var upstream_domain = upstream;
  35.     } else {
  36.         var upstream_domain = upstream_mobile;
  37.     }
  38.     url.host = upstream_domain;
  39.     if (url.pathname == '/') {
  40.         url.pathname = upstream_path;
  41.     } else {
  42.         url.pathname = upstream_path + url.pathname;
  43.     }
  44.     if (blocked_region.includes(region)) {
  45.         response = new Response('Access denied: WorkersProxy is not available in your region    yet.', {
  46.             status: 403
  47.         });
  48.     } else if (blocked_ip_address.includes(ip_address)) {
  49.         response = new Response('Access denied: Your IP address is blocked by WorkersProxy.',   {
  50.             status: 403
  51.         });
  52.     } else {
  53.         let method = request.method;
  54.         let request_headers = request.headers;
  55.         let new_request_headers = new Headers(request_headers);
  56.         new_request_headers.set('Host', url.hostname);
  57.         new_request_headers.set('Referer', url.hostname);
  58.         let original_response = await fetch(url.href, {
  59.             method: method,
  60.             headers: new_request_headers
  61.         })
  62.         let original_response_clone = original_response.clone();
  63.         let original_text = null;
  64.         let response_headers = original_response.headers;
  65.         let new_response_headers = new Headers(response_headers);
  66.         let status = original_response.status;
  67.         new_response_headers.set('access-control-allow-origin', '*');
  68.         new_response_headers.set('access-control-allow-credentials', true);
  69.         new_response_headers.delete('content-security-policy');
  70.         new_response_headers.delete('content-security-policy-report-only');
  71.         new_response_headers.delete('clear-site-data');
  72.         const content_type = new_response_headers.get('content-type');
  73.         if (content_type.includes('text/html') && content_type.includes('UTF-8')) {
  74.             original_text = await replace_response_text(original_response_clone,    upstream_domain, url_hostname);
  75.         } else {
  76.             original_text = original_response_clone.body
  77.         }
  78.         response = new Response(original_text, {
  79.             status,
  80.             headers: new_response_headers
  81.         })
  82.     }
  83.     return response;
  84. }
  85. async function replace_response_text(response, upstream_domain, host_name) {
  86.     let text = await response.text()
  87.     var i, j;
  88.     for (i in replace_dict) {
  89.         j = replace_dict[i]
  90.         if (i == '$upstream') {
  91.             i = upstream_domain
  92.         } else if (i == '$custom_domain') {
  93.             i = host_name
  94.         }
  95.         if (j == '$upstream') {
  96.             j = upstream_domain
  97.         } else if (j == '$custom_domain') {
  98.             j = host_name
  99.         }
  100.         let re = new RegExp(i, 'g')
  101.         text = text.replace(re, j);
  102.     }
  103.     return text;
  104. }
  105. async function device_status(user_agent_info) {
  106.     var agents = ["Android""iPhone""SymbianOS""Windows Phone""iPad""iPod"];
  107.     var flag = true;
  108.     for (var v = 0; v < agents.length; v++) {
  109.         if (user_agent_info.indexOf(agents[v]) > 0) {
  110.             flag = false;
  111.             break;
  112.         }
  113.     }
  114.     return flag;
  115. }

7、点击返回,这时就可以直接访问WorkerName.Subdomain.workers.dev
利用Cloudflare做个免费镜像站|青衣楼
8、在cloudflare解析后可以使用自己的域名,选择域名,点击 Workers->Add router:
利用Cloudflare做个免费镜像站|青衣楼
9、Route填 subdomain.yourdomain.com/* ,Worker选择前面的部署
利用Cloudflare做个免费镜像站|青衣楼
10、在cloudflare DNS解析里新建一个CNAME 记录指向WorkerName.Subdomain.workers.dev,等待解析生效以后就可以用自己的域名访问了:
利用Cloudflare做个免费镜像站|青衣楼

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: