如何用Cloudflare worker自建短链接服务
短链接又称短网址、短码,意思就是形式上比较短的网址,可以通过将一个普通的冗长的网址缩短生成一个新的较短的网址,便于分享传播。
短链接主要应用场景如下:
短信发送 短信里用短链接,可以极大减少字符,现在很多营销短信都是用的短网址。
社群推广 很多社区或社交网站,会屏蔽长链接。微博字数限制,公众号关键字链接限制等,短网址可以缩短字符,规避掉这些限制。
微信防屏蔽 微信里有各种屏蔽,用短链接可以避免暴露原有地址关键字,规避屏蔽。
活码 短网址是固定的,可以通过修改原链接达到变更地址的作用,此时不用去修改固定的短网址,短网址就相当于一个中间层。主要用于替换更换链接成本较高的地方,比如生成好的二维码等。
搭建
这里利用cloudflare workers提供的服务,免费版本每日100000次请求,对个人使用而言完全足够。
1const html404 = `<!DOCTYPE html>
2<body>
3 <h1>404 0.</h1>
4 <p>0.</p>
5</body>`
6
7// const statichtml = "https://raw.githubusercontent.com/1x000/zdzy/main/duanlnk/index.html"
8
9
10async function randomString (len) {
11 len = len || 6
12 let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678' /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
13 let maxPos = $chars.length
14 let result = ''
15 for (i = 0; i < len; i++) {
16 result += $chars.charAt(Math.floor(Math.random() * maxPos))
17 }
18 return result
19}
20async function checkURL (URL) {
21 let str = URL
22 let Expression = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/
23 let objExp = new RegExp(Expression)
24 return objExp.test(str) && str[0] === 'h'
25}
26async function save_url (URL, shortStr) {
27 console.log("shortStr:", shortStr)
28 let random_key
29 if (!shortStr) {
30 random_key = await randomString()
31 } else {
32 random_key = shortStr
33 }
34 let is_exist = await LINKS.get(random_key)
35 console.log(is_exist)
36 if (is_exist == null) {
37 // 正常,直接放入
38 let stat = await LINKS.put(random_key, URL)
39 if (typeof (stat) === "undefined") return random_key
40 else return stat
41 } else if (!shortStr) {
42 // 生成的random_key重复了,递归调用
43 return save_url(URL, null)
44 } else
45 // 自定义的路径已经存在了
46 return -1
47
48}
49async function handleRequest (request) {
50 console.log(request)
51 if (request.method === "POST") {
52 let req = await request.json()
53 console.log(req["url"])
54 if (!await checkURL(req["url"]))
55 return new Response(`{"msg":"0"}`, { status: 400, headers: { "Content-Type": "application/json" } })
56 let random_key = await save_url(req["url"], req["shortStr"])
57 console.log(random_key)
58 // 放成功了
59 if (Object.prototype.toString.call(random_key) === "[object String]")
60 return new Response(`{"data":{"shortUrl":"${random_key}"}}`, { status: 200, headers: { "Content-Type": "application/json" } })
61 // 自定义的路径重复了
62 else if (random_key === -1)
63 return new Response(`{"msg":"0"}`, { status: 400, headers: { "Content-Type": "application/json" } })
64 // 没测试k-v满了之后会怎么样,如果有错的话put时应该会有返回(猜测(懒
65 else return new Response(`{"msg":"0"}`, { status: 500, headers: { "Content-Type": "application/json" } })
66 }
67 const requestURL = new URL(request.url)
68 // todo 规范路径的'/'
69 const path = requestURL.pathname.toString().substring(1);
70 console.log(path)
71 if (!path) {
72
73 const html = await fetch(statichtml)
74
75 return new Response(await html.text(), {
76 headers: {
77 "content-type": "text/html;charset=UTF-8",
78 },
79 })
80 }
81 const value = await LINKS.get(path)
82 console.log(value)
83
84
85 const location = value
86 if (location) {
87 return Response.redirect(location, 302)
88
89 }
90 // If request not in kv, return 404
91 return new Response(html404, {
92 headers: {
93 "content-type": "text/html;charset=UTF-8",
94 },
95 status: 404
96 })
97}
98
99
100
101addEventListener("fetch", async event => {
102 event.respondWith(handleRequest(event.request))
103})
解释
这段代码是一个可以用Cloudflare Workers和KV存储创建一个URL缩短服务的脚本。它允许用户输入一个长URL,然后得到一个可以重定向到原始URL的短URL。它还支持自定义短URL的路径。下面是一个如何使用这段代码的教程:
- 创建一个Cloudflare账户和一个Workers订阅。你可以使用免费计划,每天允许最多10万次请求。
- 在Workers控制台中创建一个KV命名空间,命名为LINKS。这个命名空间将用来存储短URL和长URL的映射关系。
- 在Workers控制台中创建一个Worker,将这段代码粘贴到编辑器中。你可以修改代码中的一些变量,比如html404和statichtml,来自定义404页面和首页的内容。
- 部署Worker,并选择一个域名,比如example.workers.dev。这个域名将作为你的URL缩短服务的地址。
- 访问你的域名,你应该看到一个简单的网页,有一个输入框和一个按钮。你可以在输入框中输入一个长URL,然后点击按钮,就会得到一个短URL。你也可以在按钮旁边的输入框中输入一个自定义的路径,来指定你想要的短URL。如果自定义的路径已经被占用了,你会收到一个错误提示。
- 你可以复制生成的短URL,并在浏览器中打开它,就会跳转到原始的长URL。你也可以分享这个短URL给其他人,让他们访问你想要分享的网页。
警告
如果你要公开使用的话其中的HTML注释一定要去掉,如果你需要私有化的话请注释,因为总有人会往里面放写非法链接,导致域名出事。
版权声明:本文内容采用 CC BY-NC-SA 4.0
协议许可,转载请注明
文章名称:如何用Cloudflare worker自建短链接服务
文章链接:https://www.baizi.net/sharing/196.html
文章链接:https://www.baizi.net/sharing/196.html
根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24小时内从您的设备中彻底删除下载内容,否则一切后果请您自行承担,如果您喜欢该程序,请购买注册正版以得到更好的服务。
联系方式(#替换成@):serverr#baizi.net
共有 0 条评论