短url服务如何工作?

TinyURL或Metamark等服务如何工作?
他们只是简单地把这个微小的URL密钥与一个仅仅提供一个“HTTPredirect”到原始URL的[虚拟?]网页关联起来? 还是有更多的“魔术”呢?

[原文]我经常使用TinyURL,Metamark等url缩短服务,但每次我都想知道这些服务是如何工作的。 他们是否创build了一个新的文件,将redirect到另一个页面或他们使用子域名?

不,他们不使用文件。 当你点击这样一个链接时,一个HTTP请求被发送到他们的服务器的完整的URL,如http://bit.ly/duSk8wK (链接到这个问题)。 他们读取映射到其数据库的path部分(这里是duSk8wK )。 在数据库中,他们find一个描述(有时),你的名字(有时)和真实的URL。 然后,他们发出一个redirect,这是一个HTTP 302响应和头中的目标URL。

这个直接的redirect很重要。 如果您要使用文件或第一次加载HTML然后redirect,浏览器将TinyUrl添加到历史logging,这不是你想要的。 此外,被redirect到的网站将会看到引用者(您最初来自的网站)是TinyUrl链接所在的网站(即twitter.com,您自己的网站,无论链接在哪里)。 这一点同样重要,以便网站所有者可以看到人们来自哪里。 这也是,如果页面被加载redirect,将无法正常工作。

PS:还有更多types的redirect。 HTTP 301的意思是:redirect永久。 如果发生这种情况,浏览器将不再请求bit.ly或TinyUrl站点,并且这些站点要计数命中。 这就是为什么使用HTTP 302,这是一个临时的redirect。 浏览器每次都会询问TinyUrl.com或bit.ly,这样就可以为你计算点击率(一些小型的url服务提供了这个function)。

其他人已经回答了redirect如何工作,但你也应该知道他们是如何产生他们的小网站。 您将错误地听到他们创build了一个URL的散列,以便为缩短的URL生成唯一的代码。 在大多数情况下,这是不正确的,他们没有使用散列algorithm(可能有冲突)。

大多数stream行的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等)。

所以,在你的web服务器上,你可能有一个类似于(伪代码)的路由动作:

 Route: www.mytinyurl.com/{UrlID} Route Action: RouteURL(UrlID); 

它将任何传入的请求路由到您的服务器,在您的域名www.mytinyurl.com后有任何文本到您的关联方法RouteURL。 它将URL中的正斜杠后面传递的文本提供给该方法。

所以,可以说你要求:www.mytinyurl.com/fif

然后将“fif”传递给你的方法RouteURL(String UrlID)。 然后,RouteURL会将“fif”转换为相当于base10的20103,并且数据库请求将被redirect到存储在ID 20103(本例中为www.digg.com)下的任何URL。 在redirect到正确的URL之前,您还会将Digg的访问次数增加一次。

这是一个非常简单的例子,但你应该能够得到一般的想法。

作为@A Salcedo的延伸回答:

一些url缩短服务(Tinyarro.ws)通过使用Unicode(UTF-8)对缩短的url中的字符进行编码变得极端 – 在添加附加符号之前允许更多的网站。 由于大多数UTF-8被 大多数浏览器 使用 ( (IRI)RFC 3987) 所接受,从每个符号的62站点到1,112,064

可以编码1.2366863e + 12个站点,用2个符号( 1,112,064*1,112,064 )编码 – 2009年11月, bit.ly上的缩短链接被访问了2.1亿次( 大约在那个时候,bit.ly和TinyURL是最广泛的使用的URL缩短服务 ),这是比你可以适应只有2个符号约600倍,所以所有的URL缩短服务的全部存在时间应该持续另外20年,直到添加第三个符号。

简单地说,URL缩短器将任意长的字符序列(原始的,长时间的url)映射成短而平滑的字符序列。 这只是哈希,这是最常用来创build查找表,HashMap,md5哈希密码等用途。

为了理解URL缩短的过程,我在GitHub上创build了一个演示项目,同时也创build了一篇博文。 请参考这个,让我知道这是否有帮助。

博客文章: URL缩短

Interesting Posts