利用 Cloudflare Workers 创建一个跳转友链服务(乞丐级简易版)

  1. 1. pre-post()
  2. 2. reuqired(‘依赖’)
  3. 3. code(‘代码本体’)
  4. 4. subject(‘目前功能介绍’)
  5. 5. subject(‘example’)
  6. 6. end()

pre-post()

水了几篇博文胆子肥了起来,开始到处交换友链,但是想创建一个简便易维护的友链服务,前期先实现能跳转到目标链接,后期想能扩展扩展支持监控友链目标网站的有效状态,结合通知来实现报警,但本篇只实现了 能用 (逃,如果没咕咕咕的话以后会升级代码并支持更高级的功能然后再水一篇发布新文章来介绍。

更新日期: 2021-03-03

reuqired(‘依赖’)

需要做以下步骤

  • 创建一个 KV 仓库
  • 创建一个 Worker
  • KV 关联到 Worker 并命名为 FRIENDS
  • 代码本体 复制到 Worker

code(‘代码本体’)

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
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

const domains = {
get(name) {
return FRIENDS.get(name);
}
};

/**
* Respond to the request
* @param {Request} request
*/
async function handleRequest(request) {
const url = new URL(request.url);
const host = url.host;
const path = url.pathname;
let friendName = (host.match(/^(.*?)(?=\.)/g) || [])[0];
let redirect = null;

// friends.mitt.fun/{name}
if (friendName === 'friends') {
const r = /^\/?([^\/]*)\/?(.*?)$/g.exec(path) || [];
if (path.match(/^\/?$/g)) {
return indexPage();
}
friendName = r[1];
const fUrl = await domains.get(friendName);
if (fUrl) {
redirect = fUrl.replace(/\/$/g, '') + '/' + (r[2] || '');
}
} else {
const fUrl = await domains.get(friendName);
if (fUrl) {
redirect = fUrl.replace(/\/$/g, '') + path;
}
}

if (!redirect) {
return noFriendAnyMore(friendName);
}

return redirectTo(friendName, redirect);
}

function noFriendAnyMore(friendName) {
return new Response(`Sorry, ${friendName || 'this one'} is not be my firends anymore.`, {status: 200});
}

function redirectTo(friendName, url) {
return new Response('You are going to Mitt\'s friend\'s area', {status: 302, headers: {location: url}})
}

function indexPage() {
return new Response(`Hi there, this is Mitt's Friends redirector, nice to see you :)`)
}

subject(‘目前功能介绍’)

目前实现以下两种访问方式

https://{KEY}.mitt.fun

通过域名最底层的名字 {KEY} 来关联 KV 服务中的 Key

你可以定义任何层级的域名,只要最外面是 {KEY} 就可以了, 比如 https://{KEY}.friends.of.mine.mitt.fun 也同样会匹配

https://friends.mitt.fun/{KEY}

通过访问 Path 的第一层 {KEY} 来关联 KV 服务中的 Key

以上的两种方式都支持传递路径,即通过在后面跟上 /xxxx 来转发到目标网址的 /xxxx

subject(‘example’)

自定义域名方式转发:

  • 关联 edison.mitt.fun 域名到创建的 Worker
  • KV 服务中填写 Key 为 edison, Value 为 https://www.wevg.org
  • 测试访问 https://edison.mitt.fun 会302跳转到 https://www.wevg.org
  • 测试访问 https://edison.mitt.fun/friends/ 会302跳转到 https://www.wevg.org/friends/

目录方式转发:

  • 关联 friends.mitt.fun 域名到创建的 Worker
  • KV 服务中填写 Key 为 peter, Value 为 https://pzhang.net/
  • 测试访问 https://friends.mitt.fun/peter 会302跳转到 https://pzhang.net/
  • 测试访问 https://friends.mitt.fun/peter/archives/ 会302跳转到 https://pzhang.net/archives/

end()

又水了一篇,好唉。 (别问我为啥某人不在 Links