文章

新增加速域名

新增加速域名

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 进行授权