最新更新: 由于CloudFlare相关策略,不再建议使用其相关产品加速Microsoft、GitHub以及Docker等网站,以免被CF封号!如被封号责任自负。(2024年7月21日)
以下是正文
本周又是低产的一周,但整活儿记录还是要有。
一种通过Cloudflare Workers反代SharePoint进行加速的方法
不多BB,上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 const upstream = '*-my.sharepoint.com' const upstream_mobile = '*-my.sharepoint.com' const upstream_path = '/' const blocked_region = ['KP' , 'SY' , 'PK' , 'CU' ] const blocked_ip_address = ['0.0.0.0' , '127.0.0.1' ] const https = true const disable_cache = false const replace_dict = { '$upstream' : '$custom_domain' , '//sunpma.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' , upstream_domain); new_request_headers.set ('Referer' , url.protocol + '//' + url_hostname); let original_response = await fetch(url.href, { method: method, headers: new_request_headers }) connection_upgrade = new_request_headers.get ("Upgrade" ); if (connection_upgrade && connection_upgrade.toLowerCase() == "websocket" ) { return original_response; } 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; if (disable_cache) { new_response_headers.set ('Cache-Control' , 'no-store' ); } 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' ); if (new_response_headers.get ("x-pjax-url" )) { new_response_headers.set ("x-pjax-url" , response_headers.get ("x-pjax-url" ).replace("//" + upstream_domain, "//" + url_hostname)); } const content_type = new_response_headers.get ('content-type' ); if (content_type != null && 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; }
如果代码窗格显示或复制报错,请查阅原始文件 。
StepⅠ:使用方法:
注册cloudflare账号:https://dash.cloudflare.com/sign-up
有账号可以直接登陆
点击页面右边的Workers
点击:创建worker
粘贴并修改好代码后,点击“保存并部署”,即可上线了
这里需要根据自己的SharePoint网址替换其中的*号,例如我的存储空间就是bbimax-my.sharepoint.com,将*号替换为bbimax即可。
保存并部署后访问这个网页,会出现如下显示:
显示这个页面说明部署正确了,但并不能用于登录
但通过这个地址,我们已经使用cloudflare成功反代了SharePoint的流量。
StepⅡ:应用举例:
Cloudreve V3.2.1版本加入了OneDrive反代功能,在对接存储时把反代链接填上即可。
在反代服务器地址填上类似https://*.*.workers.dev/的网址即可
StepⅢ:自定义域名
如果嫌自动分配的域名不美观的话,可以自定义域名,前提是你要有个域名 ,并完成cloudflare的接入。
进入你要添加域名的主域,点击“添加记录”
添加一条CNAME记录,点击保存
点击上方的workers,点击添加路由
如图所示进行填写,注意后面的斜杠与星号必须要有,worker指向我们刚才创建的这个:
点击保存后,稍等几分钟,解析成功就可以使用了。
显示这个页面,说明成功了
StepⅣ:效果验证
测试环境:中国电信500mbps家庭宽带,其实大陆的SharePoint国际版下载速度从2018年开始就一直不太好,时常处于“带宽紧张”的状态(不排除微软自行限速的可能)。从图中我们可以看出,经过反代后,单线程下载速度已经取得了明显的提升,毕竟cloudflare的反代能力有限,具体下载速度还要取决于国际带宽情况。
使用IDM之类的多线程下载工具,也许可以获得更好的效果。
核心代码部分,参考项目:
spencerwooo /**onedrive-cf-index ;EtherDream / jsproxy **;小灯泡技术站