短链接服务是如何工作的?

118
TinyURLMetamark这样的服务是如何工作的呢?它们仅将短链接关联到一个虚拟网页,该网页提供“HTTP重定向”到原始URL吗?还是其中有更多“魔法”?

1
重新表述这个[非]问题:“像TinyURL这样的服务是如何工作的?它们是否只是将短网址键与一个[虚拟的?]网页相关联,该网页仅提供“HTTP重定向”到原始网址?这就是你所问的吗? - mjv
1
缩短的URL是否会过期?(即这些URL的数据库条目是否从服务器中删除) - thd
2
@thd:是的,但它可能取决于每日点击次数和短链接服务提供商的政策。他们也可能允许永不过期,有些则要求会员资格。 - Abel
可能是URL缩短器如何工作?的重复问题。 - roottraveller
4个回答

239
不,他们不使用文件。当您点击像这样的链接时,会向他们的服务器发送一个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服务提供此功能)。

3
我认为,Bit.ly使用HTTP 301而不是302(据我所知是最后的情况)。 - Kenny Cason
1
由于 bit.ly 不允许更改其 URL 指向的位置,因此使用 301 是有意义的。无需记住 bit.ly 版本并重新检查它。 - Joost Schuur
11
@KennyCason / @Joost Schuur:确实是使用了HTTP 301,但附带了一个时间戳,这使它变成了“已移动”而不是“永久移动”。这是一个微妙的区别。通过添加时间戳,当达到超时时,浏览器会考虑检查资源是否已更改。其他服务,如is.gd,使用普通的“301永久移动”,浏览器不需要重新检查(但经常会这样做)。最后,像url4.eu这样的服务根本不进行重定向,而是先显示广告。使用301可以仍然计算“独特访问者”的数量,但不能计算所有点击次数。 - Abel
6
例子中的 bitly 链接现在是真实存在的,并会将您重定向回这个问题;-)请参见 http://bitly.com/duSk8wK+ 以获取信息页面。 - Ronald
1
@Costa: 有很多计算点击次数的方法,可能使用了跟踪您网络卡ID的方式来追踪请求是否来自同一台计算机。虽然这种方式并非绝对可靠,因为网络卡ID可以伪造或更改。此外,它可能会跟踪或使用已在不同浏览器上设置给同一用户的第三方cookie,您可以通过清除所有会话数据并使用匿名浏览器来检查。 - Abel
显示剩余6条评论

114

其他人已经回答了重定向的工作原理,但你也应该知道它们如何生成其缩短网址。你可能会听到他们通过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等)。

因此,在您的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” 转换为它的十进制等价值20103,并发出一个数据库请求来重定向到存储在ID 20103下的任何URL(在此示例中为www.digg.com )。在重定向到正确的URL之前,还会将Digg的访问计数增加1。

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


12
谢谢你的清晰解释。如果有人想要为一个已经存在的长网址创建一个短网址,会发生什么?他们会在数据库中进行完全文本搜索吗?我觉得不会,因为这需要太多的时间。基于哈希或消息摘要的方法看起来更加实用。 - Piyush Kansal
@PiyushKansal 你可以在内部使用哈希表来进行 O(1) 的查找以找到重复的 URL,然后将现有的微小 URL 路由到那个 URL,或者选择生成一个新的 URL。据我所知,goo.gl 会为相同的 URL 重用微小的 URL;在此页面上尝试使用 goo.gl/8gVb8X,看看你是否也得到了相同的结果。 - Kingz
他们如何处理URL参数?例如www.digg.com?filter=123 - Ronen

7
作为对 @A Salcedo 答案的扩展:
一些 URL 缩短服务(Tinyarro.ws)通过使用 Unicode(UTF-8)来编码缩短的 URL 中的字符,这样可以在不添加额外符号的情况下允许更多的网站。由于大多数 UTF-8 被接受用于(IRI) RFC 3987 由大多数浏览器处理),这将从每个符号的 62 个网站增加到约 1,112,064 个。
为了更好地理解,可以用2个符号编码1.2366863e+12个站点(1,112,064*1,112,064)- 在2009年11月,bit.ly上的缩短链接被访问了21亿次(当时,bit.ly和TinyURL是最广泛使用的URL缩短服务。),这比你只用2个符号容纳的数量少了约600倍,因此在所有的URL缩短服务存在的整个时间内,至少还要再增加一个第三个符号,才能满足需求的持续增长。

7
简单来说,URL缩短器将任意长度的字符序列(原始、长且难看的URL)映射为一个短而简洁的字符序列。这实际上就是哈希,最常用于创建查找表、HashMap、md5哈希等加密目的。

为了理解URL缩短的过程,我在GitHub上创建了一个演示项目,并发布了一篇博客文章。请参考此内容并告诉我是否有所帮助。

博客文章:URL缩短


使用哈希表,我们不会面临潜在的冲突问题吗? - hardik9850

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接