-
Notifications
You must be signed in to change notification settings - Fork 4
/
jsdmirror.Cloudflare.conf
78 lines (63 loc) · 3.16 KB
/
jsdmirror.Cloudflare.conf
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
// 整体架构是这样的,这里面大部分都是正则,可以利用正则匹配来引用到其他cdn里面 这种写法比较简单,而且还能直接使用在cf里面,其他的你需要自行转换,正则匹配的路径
self.addEventListener('fetch', event => {
const url = new URL(event.request.url);
let newHostnameOrIp = '';
const pathToHostMap = [
// 具体的 npm 包路径匹配(包含可选的版本号) 黑名单npm
{
regex: /^\/npm\/chenyfan-happypic-sex(@[A-Za-z0-9.-]+|\/)?/,
hostname: '418.php'
},
// GitHub 仓库或特定前缀的路径匹配 黑名单仓库
{
regex: /^\/gh\/(.*\.)?(wodafei|qucomic|90666225|nanjingup|fznb1234|niunai88|wenmou258|cannian666999|wode-1u|woshishei138|niuzai12345|03298|oka159|nansheng-521zx|jackson0829|suxing12312|bodaxsd|ljxi|qxqx11|mumuwocal|mxqotz|miaolou|muimg1|yixuan66|qdqqd|Airmole|qwehggfgj|yixuan66|wdzhwsh4067|spfans996|sjn000|qihang119|pengzhangsir|xiaohaiya|xz211|ueletv|shijianzhong|bmw88888888|sickikco)(\/.*)?($|\?)/,
hostname: '418.php'
},
// 匹配 npm、gh、china 下的图片文件 提交腾讯云审核渠道
{
regex: /^\/(npm|gh|china)\/(.*\.)?(jpg|jpeg|gif|ico|png|bmp|webp|psd|tif|tiff|svg|avif|exif|heif|heic|dng|cr2|nef|orf|raf|rw2|pem|pgm|ppm|xbm|xpm|cur|anim|flc|fli|flx|fpx|wmf|emf|ai|eps|drw|dxf|pct|pctx|pgm|ppm|psd|psb|xcf|xwd|yuv|fits)($|\?|\/)/,
hostname: '审核服务器'
},
// 匹配 npm、gh、wp、china 下的多级目录路径 修改jsdelivr为jsdmirror
{
regex: /^\/(npm|gh|wp|china|combine)\/([^/]+\/)+$/,
hostname: 'cdn.jsdmirror.com.dir.nginx.conf'
},
// 匹配 npm、combine、cdn-cgi、gh、wp、china 开头的任意路径(作为默认或捕获剩余情况)
{
regex: /^\/(npm|combine|cdn-cgi|gh|wp|china)\//,
hostname: 'fastly.jsdelivr.net'
},
{
regex: /^\/[^/].*/, // 匹配所有非根路径
hostname: 'fastly.jsdelivr.net'
},
{
regex: /^\//, // 匹配根路径
hostname: 'index.html'
}
// 如果确实需要一个“捕获所有”的规则,请确保它是最后一个,并且前面的规则足够具体以避免不必要的覆盖
];
// 遍历映射,找到匹配的路径
for (const {
regex,
hostname
}
of pathToHostMap) {
if (regex.test(url.pathname)) {
newHostnameOrIp = hostname;
break;
}
}
// 如果没有找到匹配的路径,则使用原始的主机名(可选)
if (!newHostnameOrIp) {
event.respondWith(fetch(event.request));
return;
}
// 修改请求的URL以使用新的主机名或IP
url.hostname = newHostnameOrIp;
// 创建新的请求对象(注意:这里不需要传递event.request作为第二个参数,因为Request构造函数不需要它)
const newRequest = new Request(url.toString());
// 响应新的请求
event.respondWith(fetch(newRequest));
});