我最近使用 .NET Core 2.2 造了个名为"Link Forwarder" (链接转发器)的 URL 转发服务,并已开源。目前预览版已部署到我的子域"go.edi.wang"。本文将分享我如何构建这个项目,以及我学到的东西。
为了帮助大家了解系统并浏览代码,请查看我的 GitHub 存储库:https://github.com/EdiWang/LinkForwarder
面向的问题
互联网上的资源有时会更改其 URL。例如,当我 10 年前创建网站时,一个典型的博客文章 URL 就像"https://myolddomain.net/viewarticle.aspx?id=123"。我朋友在其他网站的帖子上引用了这个URL,或讲它发给其他人。几年后,我拥有了一个新域名,并推出了一个新的博客系统,完全改变了该文章的URL,例如"https://edi.wang/post/2009/1/1/an-old-article",这使得任何旧的URL引用都失效。还好我的博客不盈利,所以没太大关系。
但是,这个问题可能发生在企业的产品上。尤其是对于客户端系统和应用程序。比如将产品的支持链接写入安装在客户端的产品中,结果有一天该链接更改了,那么您就必须将所有客户端推送更新。
为了解决这个问题,我想以微软为榜样。微软创建了"go.microsoft.com",它使用不会更改的静态 ID,以重定向到可能随时间变化的实际 URL。例如,https://go.microsoft.com/fwlink/?linkid=2049807 指向的是基于Chromium 的 Edge 浏览器的帮助文档,该文档目前 URL 是 https://microsoftedgesupport.microsoft.com/hc/en-us 。如果文档的 URL 随时间而变化,Edge 浏览器不必更改其内置帮助链接。微软只需要更新其数据库以更改链接 ID 2049807 的目标 URL。这种"go.microsoft.com"服务在微软产品中随处可见。
这是链接转发器的基本思想。
基本流程
管理员为有效的 URL (例如https://www.some-website.com/1234/abcd/1.html) 创建Token URL(例如https://go.edi.wang/fw/e66fad1e)。然后,用户可以使用生成的Token URL 重定向到原始 URL。每次成功重定向都将偷偷记录用户的浏览器 UA 和 IP 地址,以便管理员可以查看报表并暗中观察一切(得加个隐私协议)。
报表页面
创建/编辑链接
分享链接
并非短链接服务
链接转发器非常像,但并不是短链接。关键差异在于:
短链接的目标是创建尽可能短的 URL,通常部署到非常短的域名。链接转发器并不关心是否将其部署到长域名。
大多数短链接服务不允许在创建链接后再修改。但是链接转发器的目标是面向更改。
并不简单
链接转发器不只是将Token映射到 URL。需要考虑以下问题。
它需要足够快,并能处理一定量的流量
我当前的设计会缓存有效的 URL 重定向,因此对于对同一令牌的请求,系统不会每次都查询数据库。
如何处理无效的令牌或有效但不存在的 URL?
对于无效令牌,停止请求。对于该有效的令牌,但它指向不存在的 URL(数据库中没有记录),将用户重定向到预先设置的默认 URL。
系统需要保护用户免受潜在有害链接的侵害
例如,链接转发器的数据库遭到破坏,并且 URL 指向"https://127.0.0.1/some-virus",可以触发一个事先安装在本地的病毒。用户就可能会受到攻击。其他 URL (如"/abc"、"123") 也被视为无效 URL,不会执行重定向。
对于可能包含恶意代码的互联网 URL,目前不在设计范围中。但是&#