在2021年12月20日,jsDelivr在中国大陆地区的ICP备案被吊销,且随后的服务在中国大陆地区极不稳定,严重拖慢了网页的速度。
由于jsDelivr被封锁,导致了原来使用jsDelivr的CDN服务的网页速度缓慢,多数功能不正常。要解决这个问题,要么更换CDN,要么给jsDelivr套上一层反向代理。这里博主采用了Cloudflare Worker。
 新建Worker
登录到Cloudflare控制台,点击侧栏的Workers,新建服务。

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

创建后将转入资源页面。

 部署
点击“快速编辑”,在代码框内复制以下代码:
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; }
 
  | 
 

你也可以去我的Github仓库中查看:https://github.com/pai233/jsdelivr-worker/
保存并部署后,你的反向代理就生效了。
 测试
博主部署了两个Workers,供大家免费使用:
使用时,将原来的cdn.jsdelivr.net域名替换为您的Worker或者博主提供的Worker就可以了。如:
1
   | https://cdn.jsdelivr.net/gh/pai233/cdn-assets/1.png
   | 
 

将cdn.jsdelivr.net替换为我们的Worker:
1
   | https://jsdelivr.pai233.workers.dev/gh/pai233/cdn-assets/1.png
   | 
 

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