PHP实现URL长连接转短连接方法
短链接,通俗来说,就是将长的URL 网址,通过程序计算等方式,转换为简短的网址字符串。
短链接的好处:
1、内容需要;2、用户友好;3、便于管理。实现短网址(short URL)系统比较流行的算法有两种 自增序列算法、 摘要算法
节省网址长度,便于社交化传播。(短信或者微博,字数长度受限制时。这样的短链接制作二维码也是易于识别)
方便后台跟踪点击量、地域分布等用户统计。(统计流量访问,延伸可以做网址举报屏蔽。只屏蔽短链接即可,控制输出)
规避关键词、域名屏蔽手段。
隐藏真实地址,适合做付费推广链接。
摘要算法:
1、将长网址 md5
生成 32 位签名串,分为 4 段, 每段 8 个字节
2、对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与 0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理
3、这 30 位分成 6 段, 每 5 位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串
4、总的 md5
串可以获得 4 个 6 位串,取里面的任意一个就可作为这个长 url 的短 url 地址
这种算法,虽然会生成4个Code,但是仍然存在重复几率
依据第二种算法,URL长连接转短连接实现方法如下:
语言:PHP5.6
服务器环境:LNMP
假设:长连接地址:http://www.test.com/index.php
短连接地址:http://t.test.com/六位code码
第一步:利用shortUrl()函数,生成短连接Code码,并将数据存入Mysql数据库;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <?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 |
数据库结构(可自定义):
1 2 3 4 5 6 7 | 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;
}
短连接地址:
服务器会通过Code短码2aEzqe获取对应的长URL,并通过HTTP 301/302重定向到对应的长连接地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现