教你如何使用CFWorker镜像一个网站

社区服务
高级搜索
猴岛论坛电脑百科教你如何使用CFWorker镜像一个网站
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
4个回复

[技术小组]教你如何使用CFWorker镜像一个网站

楼层直达
   三岁

ZxID:44344

糖果

举报 只看楼主 使用道具 楼主   发表于: 2023-08-16 0
今天教大家一种新的关于 CloudFlare Worker 的玩法 - 利用 Cloudflare Worker 搭建镜像网站!

需要注册CloudFlare账号(这里简称:CF )

搭建教程

1. 点击 创建 Worker


2. 创建完毕后,点击编辑代码:将原有的示例代码全部删除


3. 将下方代码全部粘贴到代码框里,如下图所示:


  1. // 反代目标网站.
  2. const upstream = 'lb5.net'
  3. // 反代目标网站的移动版.
  4. const upstream_mobile = 'lb5.net'
  5. // 访问区域黑名单(按需设置).
  6. const blocked_region = ['TK']
  7. // IP地址黑名单(按需设置).
  8. const blocked_ip_address = ['0.0.0.0', '127.0.0.1']
  9. // 路径替换.
  10. const replace_dict = {
  11. '$upstream': '$custom_domain',
  12. '//archiveofourown.org': ''
  13. }
  14. addEventListener('fetch', event => {
  15. event.respondWith(fetchAndApply(event.request));
  16. })
  17. async function fetchAndApply(request) {
  18. const region = request.headers.get('cf-ipcountry').toUpperCase();
  19. const ip_address = request.headers.get('cf-connecting-ip');
  20. const user_agent = request.headers.get('user-agent');
  21. let response = null;
  22. let url = new URL(request.url);
  23. let url_host = url.host;
  24. if (url.protocol == 'http:') {
  25.     url.protocol = 'https:'
  26.     response = Response.redirect(url.href);
  27.     return response;
  28. }
  29. if (await device_status(user_agent)) {
  30.     var upstream_domain = upstream;
  31. } else {
  32.     var upstream_domain = upstream_mobile;
  33. }
  34. url.host = upstream_domain;
  35. if (blocked_region.includes(region)) {
  36.     response = new Response('Access denied: WorkersProxy is not available in your region yet.', {
  37.         status: 403
  38.     });
  39. } else if(blocked_ip_address.includes(ip_address)){
  40.     response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', {
  41.         status: 403
  42.     });
  43. } else{
  44.     let method = request.method;
  45.     let request_headers = request.headers;
  46.     let new_request_headers = new Headers(request_headers);
  47.     new_request_headers.set('Host', upstream_domain);
  48.     new_request_headers.set('Referer', url.href);
  49.     let original_response = await fetch(url.href, {
  50.         method: method,
  51.         headers: new_request_headers
  52.     })
  53.     let original_response_clone = original_response.clone();
  54.     let original_text = null;
  55.     let response_headers = original_response.headers;
  56.     let new_response_headers = new Headers(response_headers);
  57.     let status = original_response.status;
  58.     new_response_headers.set('cache-control' ,'public, max-age=14400')
  59.     new_response_headers.set('access-control-allow-origin', '*');
  60.     new_response_headers.set('access-control-allow-credentials', true);
  61.     new_response_headers.delete('content-security-policy');
  62.     new_response_headers.delete('content-security-policy-report-only');
  63.     new_response_headers.delete('clear-site-data');
  64.     const content_type = new_response_headers.get('content-type');
  65.     if (content_type.includes('text/html') && content_type.includes('UTF-8')) {
  66.         original_text = await replace_response_text(original_response_clone, upstream_domain, url_host);
  67.     } else {
  68.         original_text = original_response_clone.body
  69.     }
  70.     response = new Response(original_text, {
  71.         status,
  72.         headers: new_response_headers
  73.     })
  74. }
  75. return response;
  76. }
  77. async function replace_response_text(response, upstream_domain, host_name) {
  78. let text = await response.text()
  79. var i, j;
  80. for (i in replace_dict) {
  81.     j = replace_dict[i]
  82.     if (i == '$upstream') {
  83.         i = upstream_domain
  84.     } else if (i == '$custom_domain') {
  85.         i = host_name
  86.     }
  87.     
  88.     if (j == '$upstream') {
  89.         j = upstream_domain
  90.     } else if (j == '$custom_domain') {
  91.         j = host_name
  92.     }
  93.     let re = new RegExp(i, 'g')
  94.     text = text.replace(re, j);
  95. }
  96. return text;
  97. }
  98. async function device_status (user_agent_info) {
  99. var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"];
  100. var flag = true;
  101. for (var v = 0; v < agents.length; v++) {
  102.     if (user_agent_info.indexOf(agents[v]) > 0) {
  103.         flag = false;
  104.         break;
  105.     }
  106. }
  107. return flag;
  108. }


引用
const upstream = '你需要镜像的网站域名'
const upstream_mobile = '你需要镜像的网站的移动版'
const blocked_region = ['访问区域黑名单(按需设置)']
const blocked_ip_address = ['IP地址黑名单(按需设置)', '127.0.0.1']


粘贴好后按需修改上方参数,修改好之后,点击 保存并部署

下面截图使用了猴岛论坛作为列子:


Ps:wordke自带的‘.workers.dev’域名需要科学上网才能访问。


本帖de评分: 1 条评分 DB +10
DB+10 2023-08-16

我很赞同

[/url]
猴岛论坛技术组-神一般的头衔 各个领域 天才云集 福利多多 你还在等什么 赶快加入我们吧!

小野博客
算账

ZxID:29357411

等级: 版主
配偶: 浓酒与歌

举报 只看该作者 沙发   发表于: 2023-08-16 0
谢谢你
Null.

ZxID:171717

等级: 版主
配偶: 金度延
接电脑组装配置咨询  IP查定位等

举报 只看该作者 板凳   发表于: 2023-08-16 0
我很赞同
归遇

ZxID:5231

等级: 版主

举报 只看该作者 地板   发表于: 2023-08-17 0
Re:每日一晒8.17
感谢分享 这个厉害了
老赵.

ZxID:7272

等级: 总版主
配偶: 大小姐 
啊?

举报 只看该作者 4楼  发表于: 2023-08-17 0
感谢分享
« 返回列表
发帖 回复