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重定向到对应的长连接地址

 

posted @   穷帅哥依然纵横一方  阅读(702)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示