51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

使用Cloudflare Worker为jsDelivr搭建反向代理服务

在2021年12月20日,jsDelivr在中国大陆地区的ICP备案被吊销,且随后的服务在中国大陆地区极不稳定,严重拖慢了网页的速度。

由于jsDelivr被封锁,导致了原来使用jsDelivr的CDN服务的网页速度缓慢,多数功能不正常。要解决这个问题,要么更换CDN,要么给jsDelivr套上一层反向代理。这里博主采用了Cloudflare Worker。

新建Worker {#新建worker}

登录到Cloudflare控制台,点击侧栏的Workers,新建服务。

1645243199883.png

在创建页面填入你自己的服务名称。
1645243337089.png

创建后将转入资源页面。

1645243674509.png

部署 {#部署}

点击"快速编辑",在代码框内复制以下代码:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 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 | // 替换成你想镜像的站点 const upstream = 'cdn.jsdelivr.net' // 如果那个站点有专门的移动适配站点,否则保持和上面一致 const upstream_mobile = 'cdn.jsdelivr.net' const blocked_region = [ 'KP' , 'RU' ] const blocked_ip_address = [ '0.0.0.0' , '127.0.0.1' ] const replace_dict = { '$upstream' : '$custom_domain' , '//cdn.jsdelivr.net' : '' } //以下内容都不用动 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_host = url. host ; if (url. protocol == 'http:' ) { url. protocol = 'https:' response = Response . redirect (url. href ); return response; } if ( await device_status (user_agent)) { upstream_domain = upstream } else { upstream_domain = upstream_mobile } url. host = upstream_domain; 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. href ); 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_host); } 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; } |

1645243793805.png

你也可以去我的Github仓库中查看: https://github.com/pai233/jsdelivr-worker/

保存并部署后,你的反向代理就生效了。

测试 {#测试}

博主部署了两个Workers,供大家免费使用:

使用时,将原来的 cdn.jsdelivr.net 域名替换为您的Worker或者博主提供的Worker就可以了。如:

|-----------|--------------------------------------------------------------------| | 1 | https: // cdn.jsdelivr.net /gh/ pai233 /cdn-assets/ 1 .png |

jsDelivr加载

cdn.jsdelivr.net 替换为我们的Worker:

|-----------|-------------------------------------------------------------------------------| | 1 | https: // jsdelivr.pai233.workers.dev /gh/ pai233 /cdn-assets/ 1 .png |

Worker加载

这样,就能保证较为稳定的使用jsDelivr的服务了。

赞(0)
未经允许不得转载:工具盒子 » 使用Cloudflare Worker为jsDelivr搭建反向代理服务