短网址、短链接究竟是一种神秘技术

短链接(Short Link)顾名思义就是长度比较短的网址。如:http://mrw.so/x。早期,短链接主要应用在网站的图片上传中,上传网站通过特定的算法缩短 URL(Uniform Resource Locator,统一资源定位符)链接地址,达到减少代码字符数的目的。

随着微博的快速发展,微博用户数量呈爆炸式增长,微博用户间的信息传播、信息分享较之传统的网络形式进一步加速,所分享的内容也呈多样化趋势,使得短链接服务活跃起来。因为微博内容一般都有字数限制,较长的URL 地址会挤压正文的空间。

而短链接生成器正好解决了这种问题,借助短链接生成器可以用简短的网址替代原来冗长的网址,给用户留下更多的正文空间。

1、短链接的实现原理

短链接主要是通过域名重定向技术,将长网址通过一定的算法转换成一个短链接。当用户访问这个短链接时就可以直接跳转到较长的 U R L 地址上。域名重定向技术也可以称为U R L 转发技术,它是通过网站服务器或者 W eb 应用程序的设置,将访问当前域名的用户引导至指定的另一个 URL 地址。

短链接生成器通常使用的是 301、302 或者 META 转向:

1)301、302 转向

使用 php 中的 header() 函数可以实现 301重定向(永久性转移)或 302 重定向(暂时性转移)。

当客户端访问短链接的 php 页面时,服务器端使用header() 函数向客户端发送原始的 H TTP 报头,在 H TTP 数据头中的Location段中给出相应的长地址。

header函数说明见表

header函数

例:header('Location: http://mrw.so /',true ,301)。表示向客户端浏览器发送命令,强制 H TTP 响应代码为 301,并将该报头替换之前的报头,将重定位地址设为 http://980.so /。

\"301\"

2)META 刷新转向

利用 H TM L 标记 M E TA 中的 R E FR E SH,设定相应的跳转地址,在特定时间后重定向到新的网页 。例 :H TTP-EQ U IV="R E FR E SH " CO N TEN T="5; U R L=index.asp">。在等待 5 秒后,网页将通过刷新的办法重定位到index.asp 的网页。

2、短链接网站的快速搭建

目前互联网上许多个人短链接服务都使用 php 的转向方式,互联网也有许多完整的 php 源码网站,方便个人搭建自己的短链接网站。Phurl是网上较为流行的短链接网站源码,其通过 PH P 和 M ySQ L 实现网址缩短服务,程序仅19K B,包括建库脚本和后台程序。Phurl的搭建极为简单,如下所示 :

1) 在支持 PH P 的服务器中,将 Phurl网站文件放到需要建立网站的目录下。

2) 在 M ySQL 中新建一个数据库。

3) 通过导入 phurl.sql文件,建立所需的数据表 phurl_settings和 phurl_urls。

4) 根据自身需求,修改config.php文件内的配置信息。

5) 进行测试,通过访问 index.php,可以对长网址进行缩短处理,短链接则通过 redirect.php 的处理转向长网址所在的网页。

3、短链接服务的转换算法

Phurl的转换算法就是将短码和长网址在本地数据库建立一一对应的关系。用户访问短链接时,后台通过查找到对应的长网址,通知客户端,客户端进行页面转向操作。

phurl_urls的数据表中存放了id,url,code,alias,date_added;phurl_settings的数据表中仅存放 last_num ber。id 是自增长的主键,url是长网址,code是短码,alias是别名,date_added是记录添加时间,last_num ber是最后一条记录的整数。

算法实现主要函数如表

算法实现主要函数

为了尽可能缩短短链接的字符串长度,Phurl采用了更高进制的表示规则。短码 code 就是是通过函数 generate_code($num ber)产生的高进制数。函数源码如下:

  function generate_code($num ber)

  {

  $out = "";

  $codes = "abcdefghjkm npqrstuvwxyz23456789ABCDEFGH JK

  M NPQRSTUVW XYZ";

  while ($num ber > 53)

  {

  $key = $num ber % 54;

  $num ber = floor($num ber / 54) - 1;

  $out = $codes{$key}.$out;

  }

  return $codes{$num ber}.$out;

  }

函数中自定义了数字和大小写的字母组成的 54 位字符串,从前至后每个字符代表为 54 进制中 0-53。如果用上面的 54进制表示,则 4 个字符长的短码则可以表达 850万多条记录,6 个字符长的短码则可以表达 247 亿多条记录。