短连接,通俗来讲,就是将长的URL 网址,经过程序计算等方式,转换为简短的网址字符串。php
这样的话其好处为:一、内容须要;二、用户友好;三、便于管理。nginx
实现短网址(short URL)系统比较流行的算法有两种 自增序列算法、 摘要算法算法
自增序列算法 也叫永不重复算法sql
设置 id 自增,一个 10进制 id 对应一个 62进制的数值,1对1,也就不会出现重复的状况。这个利用的就是低进制转化为高进制时,字符数会减小的特性。数据库
一、将长网址 md5
生成 32 位签名串,分为 4 段, 每段 8 个字节api
二、对这四段循环处理, 取 8 个字节, 将他当作 16 进制串与 0x3fffffff(30位1) 与操做, 即超过 30 位的忽略处理服务器
三、这 30 位分红 6 段, 每 5 位的数字做为字母表的索引取得特定字符, 依次进行得到 6 位字符串函数
四、总的 md5
串能够得到 4 个 6 位串,取里面的任意一个就可做为这个长 url 的短 url 地址url
这种算法,虽然会生成4个Code,可是仍然存在重复概率spa
以上两种算法具体实现原理参考:短网址(short URL)系统的原理及其实现
依据第二种算法,URL长链接转短链接实现方法以下:
语言:PHP5.6
服务器环境:LNMP
假设:长链接地址:http://www.test.com/index.php
短链接地址:http://t.test.com/六位code码
第一步:利用shortUrl()函数,生成短链接Code码,并将数据存入Mysql数据库;
函数shorturl():
<?php /** * 由长链接生成短连接操做 * * 算法描述:使用6个字符来表示短连接,咱们使用ASCII字符中的'a'-'z','0'-'9','A'-'Z',共计62个字符作为集合。 * 每一个字符有62种状态,六个字符就能够表示62^6(56800235584),那么如何获得这六个字符, * 具体描述以下: * 1. 对传入的长URL+设置key值 进行Md5,获得一个32位的字符串(32 字符十六进制数),即16的32次方; * 2. 将这32位分红四份,每一份8个字符,将其视做16进制串与0x3fffffff(30位1)与操做, 即超过30位的忽略处理; * 3. 这30位分红6段, 每5个一组,算出其整数值,而后映射到咱们准备的62个字符中, 依次进行得到一个6位的短连接地址。 * */ function shortUrl( $long_url ) { $key = 'swz0823'; //自定义key值 $base32 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 利用md5算法方式生成hash值 $hex = hash('md5', $long_url.$key); $hexLen = strlen($hex); $subHexLen = $hexLen / 8; $output = array(); for( $i = 0; $i < $subHexLen; $i++ ) { // 将这32位分红四份,每一份8个字符,将其视做16进制串与0x3fffffff(30位1)与操做 $subHex = substr($hex, $i*8, 8); $idx = 0x3FFFFFFF & (1 * ('0x' . $subHex)); // 这30位分红6段, 每5个一组,算出其整数值,而后映射到咱们准备的62个字符 $out = ''; for( $j = 0; $j < 6; $j++ ) { $val = 0x0000003D & $idx; $out .= $base32[$val]; $idx = $idx >> 5; } $output[$i] = $out; } return $output; } $url = 'http://www.test.com/index.php';//长链接 $ret = shortUrl($url); var_dump($ret); ################ 打印结果 ################ /* array(4) { [0]=> string(6) "2aEzqe" [1]=> string(6) "Rj6Bve" [2]=> string(6) "f2mQvi" [3]=> string(6) "z2eqYv" } */ #将长链接url与短连接Code结果存入数据库,取其中一个用于显示便可。例:短链接地址:http://t.test.com/2aEzqe
数据库结构(可自定义):
CREATE TABLE `long_short_url` ( `id` int(32) unsigned NOT NULL AUTO_INCREMENT, `long_url` varchar(255) DEFAULT NULL, `short_url_code` varchar(255) DEFAULT NULL, `create_time` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=utf8;
第二步:服务器301/302重定向Api接口以下,(假如此Api接口地址:http://www.test.com/api/longUrl?code=六位code码)
public function longUrl(){ $map['short_url'] = $_GET['code']; $data =M('long_short_url')->where($map) ->find(); $url = $data['long_url']; header("location:$url"); }
第四部:修改Nginx服务器nginx.conf配置文件
在底部(任意位置)增添如下代码:
server { listen 80; server_name t.test.com; rewrite ^/(.*) http://www.test.com/Api/longUrl?code=$1 redirect; access_log off; }
而后保存,重启Nginx服务器。
当咱们请求经过短链接地址:
http://t.test.com/2aEzqe时, 服务器会经过Code短码 2aEzqe 获取对应的长 URL,并经过HTTP 301/302重定向到对应的长链接地址;
另外:
1.自增序列算法实现方法参考实例:php实现短连接系统
2.PHP开源短链接生成系统:YOURLS
YOURLS (Your Own URL Shortener) 是一款使用PHP+Mysql开发的短连接程序,让你能够轻松创建属于本身的短网址生成系统。而无需第三方平台你就能够得到全部的数据统计,而且支持一系列插件扩展。
安装流程:
user/config-sample.php
重命名为 user/config.php
;user/config.php
文件,填入数据库信息和配置站点等选项;http://yoursite.com/admin/
便可!