新增加速域名
新增加速域名
jsDelivr 加速
由于不可抗力原因,jsDelivr部分地区访问不稳定,且本博客深度依赖jsDelivr,因此新增加速域名,使用CloudFlare Workers转发博客页面并替换其中的CDN域名为jsd.onmicrosoft.cn。
备用加速域名:https://blog-cn.davidx.top。
附上简单的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
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const CONFIG = {
ALLOWED_HOSTNAME: 'blog-cn.davidx.top',
ORIGIN_HOSTNAME: 'blog-zh.pages.dev',
REPLACE_RULES: {
'cdn.jsdelivr.net': 'jsd.onmicrosoft.cn',
},
IMAGE_EXTENSIONS: ['.jpg', '.jpeg', '.png', '.gif', '.svg', '.webp', '.ico']
}
async function handleRequest(request) {
const url = new URL(request.url)
if (url.hostname !== CONFIG.ALLOWED_HOSTNAME) {
return new Response('Invalid hostname', { status: 403 })
}
let originHost = `${CONFIG.ORIGIN_HOSTNAME}`
let pathname = url.pathname
const fetchUrl = `https://${originHost}${pathname}${url.search}`
try {
let response = await fetch(fetchUrl, {
method: request.method,
headers: request.headers
})
// 检查是否为图片请求
const isImage = CONFIG.IMAGE_EXTENSIONS.some(ext =>
url.pathname.toLowerCase().endsWith(ext)
)
if (isImage) {
// 图片请求直接返回二进制数据
const newResponse = new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: response.headers
})
newResponse.headers.set('Access-Control-Allow-Origin', '*')
newResponse.headers.set('Cache-Control', 'public, max-age=86400')
return newResponse
}
// 非图片请求保持原有处理逻辑
let body = await response.text()
// 替换资源域名
for (const [from, to] of Object.entries(CONFIG.REPLACE_RULES)) {
body = body.replaceAll(from, to)
}
body = body.replaceAll(`${CONFIG.ORIGIN_HOSTNAME}`, `${CONFIG.ALLOWED_HOSTNAME}`)
// 构建新响应
const newResponse = new Response(body, {
status: response.status,
statusText: response.statusText,
headers: response.headers
})
// 设置响应头
newResponse.headers.set('Access-Control-Allow-Origin', '*')
newResponse.headers.set('Cache-Control', 'public, max-age=3600')
return newResponse
} catch (err) {
return new Response('Error: ' + err.message, { status: 500 })
}
}
该代码基于自己已有的项目wikimirror。
欢迎加载原域名不方便的用户使用备用加速域名,也可以评论告诉我你的使用体验。
未来计划
根据IP自动选择是否修改CDN域名,实现无缝切换。
本文由作者按照 CC BY 4.0 进行授权