TinyURL或Metamark等服务如何工作?
他们是否只是将微小的URL密钥与仅提供“ HTTP重定向”到原始URL的[虚拟?]网页相关联?还是还有更多“魔术”呢?
[原始措辞]我经常使用URL缩短服务,例如TinyURL,Metamark等,但每次这样做,我都想知道这些服务的工作方式。他们是否创建了将重定向到另一个页面的新文件,还是使用了子域?
TinyURL或Metamark等服务如何工作?
他们是否只是将微小的URL密钥与仅提供“ HTTP重定向”到原始URL的[虚拟?]网页相关联?还是还有更多“魔术”呢?
[原始措辞]我经常使用URL缩短服务,例如TinyURL,Metamark等,但每次这样做,我都想知道这些服务的工作方式。他们是否创建了将重定向到另一个页面的新文件,还是使用了子域?
Answers:
不,他们不使用文件。当您单击这样的链接时,HTTP请求将使用完整的URL发送到其服务器,例如http://bit.ly/duSk8wK(指向此问题的链接)。他们读取路径部分(在此处duSk8wK
),该部分映射到他们的数据库。他们在数据库中找到描述(有时),您的名字(有时)和真实URL。然后,他们发出重定向,该重定向是HTTP 302响应和标头中的目标URL。
此直接重定向很重要。如果要使用文件或先加载HTML然后重定向,浏览器会将TinyUrl添加到历史记录中,这不是您想要的。另外,重定向到的站点将看到引荐来源网址(您最初来自的站点)为TinyUrl链接所在的站点(即twitter.com,您自己的站点,无论该链接位于何处)。这同样重要,以便网站所有者可以看到人们的来源。如果加载了重定向页面,这也将不起作用。
PS:重定向的类型更多。HTTP 301的意思是:永久重定向。如果发生这种情况,浏览器将不再请求bit.ly或TinyUrl网站,而这些网站希望计算点击数。这就是为什么使用HTTP 302(这是一个临时重定向)的原因。浏览器将再次询问TinyUrl.com或bit.ly,这使您可以为您统计点击数(某些小型url服务提供了此功能)。
Moved
不Moved Permanently
。这是一个微妙的区别。通过添加时间戳,浏览器认为应该在达到此超时时检查资源是否已更改。其他的,例如is.gd,则使用普通301 Moved Permanently
的浏览器,不需要重新检查(但通常会重新检查)。最后,诸如url4.eu之类的服务根本不会重定向,但会首先向您显示广告。使用301,该服务仍可以统计唯一身份访问者,但并非全部点击。
其他人已经回答了重定向的工作原理,但是您也应该知道它们如何生成其微小的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(String UrlID)。然后,RouteURL会将“ fif”转换为等效的base10(20103),并将发出数据库请求以重定向到ID为20103(在本例中为www.digg.com)下存储的URL。在重定向到正确的URL之前,您还可以将Digg的访问次数增加1。
这是一个非常简化的示例,但是您应该能够了解一般的想法。
O(1)
查找以查找重复项;然后为此路由现有的微小URL,或者可以选择生成一个新的URL。据我所知,goo.gl
对于相同的URL重复使用了微小的URL。尝试在此页面上尝试此操作:您得到此>> goo.gl/8gVb8X
吗?
作为@A Salcedo答案的扩展:
一些URL缩短服务(Tinyarro.ws)通过使用Unicode(UTF-8)在缩短的url中编码字符而变得极端-这允许在添加其他符号之前使用大量网站。由于大多数UTF-8都可以使用(大多数浏览器处理的(IRI)RFC 3987),因此62
每个符号的站点从〜过渡到〜1,112,064
。
从一个角度来看,可以用2个符号(1,112,064*1,112,064
)编码1.2366863e + 12个站点-在2009年11月,缩短的链接bit.ly
被访问了2.1
十亿次(在那个时候,bit.ly和TinyURL是使用最广泛的URL缩短服务。)这比仅2个符号可容纳的内容少600倍左右,因此对于所有url缩短服务的完整存在期限,它至少应持续20年,直到添加第三个符号为止。
用简单的话来说,URL缩短器将任意长的字符序列(原始的长long脚url)映射为短而光滑的字符序列。这不过是哈希,哈希最常用于创建查找表,HashMap,用于加密目的的md5哈希等。
为了了解URL缩短过程,我在GitHub上创建了一个演示项目,同时还在博客中创建了一个博客。请参考此内容,让我知道是否有帮助。
博客文章:URL缩短