像 TinyURL或 Metamark这样的服务是如何工作的? 他们是否只是简单地将小 URL 键与[虚拟? ]关联起来网页只提供「 HTTP 重定向」至原来的网址?还是有更多的“魔法”?
[原文] 我经常使用网址缩写服务,比如 TinyURL、 Metamark 和其他网站,但是每次我这样做的时候,我都在想这些服务是如何工作的。他们创建一个新的文件,将重定向到另一个页面或他们使用子域?
不,他们不用文件。当你点击这样的链接时,一个 HTTP 请求会以完整的 URL 发送到他们的服务器,就像 http://bit.ly/duSk8wK(链接到这个问题)。他们读取路径部分(这里是 duSk8wK) ,该部分映射到他们的数据库。在数据库中,他们找到一个描述(有时) ,你的名字(有时)和真正的 URL。然后他们发出一个重定向,这是一个 HTTP302响应和标题中的目标 URL。
duSk8wK
这个直接重定向很重要。如果你使用文件或者首先加载 HTML 然后重定向,浏览器会将 TinyUrl 添加到历史记录中,这不是你想要的。此外,被重定向到的网站将看到引用者(你最初来自的网站)作为 TinyUrl 链接所在的网站(例如,twitter.com,你自己的网站,无论链接在哪里)。这一点同样重要,这样网站所有者就可以看到人们从哪里来。如果加载了重定向的页面,这也不会起作用。
附言: 有更多的重定向类型。HTTP 301意味着: 重定向永久。如果发生这种情况,浏览器将不再请求 bit.ly 或 TinyUrl 网站,而这些网站希望统计点击量。这就是为什么要使用 HTTP 302,它是一个临时重定向。浏览器会再次询问 TinyUrl.com 或 bit.ly,这样就可以为你计算点击量(一些小型的网址服务提供这种服务)。
其他人已经回答了重定向是如何工作的,但是您还应该知道它们是如何生成它们的微型 url 的。您会错误地听到他们创建 URL 的散列,以便为缩短后的 URL 生成唯一的代码。这在大多数情况下是不正确的,它们没有使用哈希算法(在这种算法中可能存在冲突)。
大多数流行的 URL 缩短服务只是获取 URL 数据库中的 ID,然后将其转换为 Base 36[ a-z0-9](不区分大小写)或 Base 62(区分大小写)。
TinyURL 数据库表的一个简化示例:
ID URL VisitCount 1 www.google.com 26 2 www.stackoverflow.com 2048 3 www.reddit.com 64 ... 20103 www.digg.com 201 20104 www.4chan.com 20
支持灵活路由的 Web 框架使得处理传入的 URL 变得非常容易(Ruby、 ASP.NET MVC 等)。
所以,在你的网络服务器上,你可能有一个路由动作,看起来像(伪代码) :
Route: www.mytinyurl.com/{UrlID} Route Action: RouteURL(UrlID);
它将任何传入的请求路由到您的服务器,如果该服务器在您的域 www.mytinyurl.com 之后有任何文本,则路由到您的相关方法 RouteURL。它提供在 URL 的正斜杠之后传递给该方法的文本。
假设你要求 www.mytinyurl.com/fif
“ fif”将被传递给您的方法 RouteURL (StringUrlID)。然后,RouteURL 将“ fif”转换为它的 base10等价物,20103,并且数据库请求将被重定向到 ID 20103下存储的任何 URL (在本例中,是 www.digg.com)。在重定向到正确的 URL 之前,还需要将 Digg 的访问次数增加一次。
This is a really simplified example but you should be able to get the general idea.
As an extension to @A Salcedo answer:
一些网址缩写服务(Tinyarro.ws)走极端,使用 Unicode (UTF-8)将字符编码成缩短的网址,这样就可以在添加额外符号之前提供更多的网站。由于大多数 UTF-8被接受使用((IRI)大多数浏览器处理的 RFC3987) ,从每个符号的 62位点碰撞到 ~ 1,112,064。
62
1,112,064
展望未来,人们可以用2个符号(1,112,064*1,112,064)编码1.2366863 e + 12个站点——在2009年11月,bit.ly上的缩短链接被访问了20亿次(大约在那个时候,bit.ly 和 TinyURL 是使用最广泛的网址缩写服务。) ,比你只能用2个符号访问的次数少了约600倍,因此,对于所有网址缩短服务的全部存在期,它应该至少再持续20年,直到添加第三个符号。
1,112,064*1,112,064
bit.ly
简而言之,URL 缩短程序将任意长的字符序列(原始的、长的、蹩脚的 URL)映射为简短而流畅的字符序列。这只不过是哈希,它最常用于创建查找表、 HashMap、用于加密目的的 md5哈希等。
为了理解 URL 缩短过程,我在 GitHub 上创建了一个演示项目,还有一篇博客文章。一定要提到这个,让我知道它是否有帮助。
Blog Post: 网址缩短博文: 网址缩短