短网址服务如何运作?

Nat*_*pos 102 url web-services bit.ly url-shortener short-url

TinyURLMetamark等服务如何运作?
他们是否只是将微小的URL密钥与[虚拟?]网页相关联,该网页仅提供原始URL的"HTTP重定向"?或者它有更多的"魔力"吗?

[原创措辞]我经常使用网址缩短喜欢TinyURL的,METAMARK和其他服务,但我每次做的时候,我不知道这些服务是如何工作的.他们是否创建了一个新文件,该文件将重定向到另一个页面,或者他们是否使用子域?

Abe*_*bel 220

不,他们不使用文件.当您单击类似的链接时,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,这样可以为您计算点击数(一些小网址服务提供此功能).

  • @KennyCason/@Joost Schuur:确实使用的是HTTP 301,但是带有时间戳.这把它变成了'Moved`而不是'Moved Permanently`.这是一个微妙的差异.通过添加时间戳,浏览器认为在达到此超时时应检查资源是否已更改.其他人,比如is.gd,使用普通的`301 Moved Permanently`,浏览器不需要重新检查(但经常会).最后,像url4.eu这样的服务根本不会重定向,而是首先向您显示广告.有了301,服务仍然可以统计*独特的访问者*,但不是所有的点击量. (11认同)
  • 示例bitly URL现在是真实的,实际上重定向回到这个问题;-)请参阅http://bitly.com/duSk8wK+获取信息页面. (6认同)
  • 实际上我认为,Bit.ly使用HTTP 301而不是302(我听到的最后一次) (2认同)

A S*_*edo 106

其他人已经回答了重定向的工作原理,但你也应该知道他们如何生成他们的小网址.你会错误地听到他们创建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
Run Code Online (Sandbox Code Playgroud)

允许灵活路由的Web框架使得处理传入的URL非常容易(Ruby,ASP.NET MVC等).

因此,在您的网络服务器上,您可能有一个看起来像(伪代码)的路由操作:

Route: www.mytinyurl.com/{UrlID}
Route Action: RouteURL(UrlID);
Run Code Online (Sandbox Code Playgroud)

将您域www.mytinyurl.com之后有任何文本的任何传入请求路由到您的关联方法RouteURL.它将URL中正斜杠后传入的文本提供给该方法.

所以,让我们说你要求:www.mytinyurl.com/fif

然后将"fif"传递给您的方法RouteURL(String UrlID).然后RouteURL将"FIF"转换为它的base10相当于20103和数据库请求将进行重定向到URL无论是ID 20103下保存(在这种情况下,www.digg.com).在重定向到正确的URL之前,您还需要将Digg的访问次数增加一次.

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

  • 谢谢你的好解释.那么当有人试图为现有的长URL创建一个短URL时会发生什么?他们是否对数据库执行全文搜索?我不这么认为,因为它会耗费太多时间.基于哈希或基于消息摘要的方法看起来更实用. (12认同)

Mat*_*ius 7

作为@A Salcedo的扩展回答:

一些网址缩短服务(Tinyarro.ws)通过使用Unicode(UTF-8)对缩短网址中的字符进行编码而变得极端 - 在允许添加额外符号之前允许更多数量的网站.由于大多数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年,直到添加第三个符号.


小智 7

简而言之,URL 缩短器将任意长的字符序列(原始的、长而蹩脚的 url )映射为短而光滑的字符序列。这只不过是哈希,它最常用于创建查找表、HashMap、用于加密目的的 md5 哈希等。

为了理解 URL 缩短过程,我在 GitHub 上创建了一个演示项目和一篇博客文章。请参考this并让我知道它是否有帮助。

博客文章:URL 缩短