短链接,通俗来说,就是将长的URL 网址,通过程序计算等方式,转换为简短的网址字符串。

这样的话其好处为:1、内容需要;2、用户友好;3、便于管理。

实现短网址(short URL)系统比较流行的算法有两种 自增序列算法、 摘要算法

自增序列算法:

自增序列算法 也叫永不重复算法

设置 id 自增,一个 10进制 id 对应一个 62进制的数值,1对1,也就不会出现重复的情况。这个利用的就是低进制转化为高进制时,字符数会减少的特性。

摘要算法:

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,但是仍然存在重复几率

以上两种算法具体实现原理参考:短网址(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开发的短链接程序,让你可以轻松建立属于自己的短网址生成系统。而无需第三方平台你就可以获得所有的数据统计,并且支持一系列插件扩展。

安装流程:

  1. 将安装包解压并上传至服务器;
  2. 将 user/config-sample.php 重命名为 user/config.php
  3. 编辑 user/config.php 文件,填入数据库信息和配置站点等选项;
  4. 访问 http://yoursite.com/admin/ 即可!

PHP实现URL长连接转短连接方法总结的更多相关文章

  1. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  2. HTTP协议原理(长连接,短连接/ get,post区别等等)

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  3. 20 HTTP 长连接与短连接

    20 HTTP 长连接与短连接 每日一句 纸上得来终觉浅,绝知此事要躬行. 每日一句 Never give up until the fight is over. 永远不要放弃,要一直战斗到最后一秒. ...

  4. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

  5. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

  6. (转)HTTP 长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  7. HTTP长连接和短连接

    1.HTTP协议的五大特点1)支持客户/服务器模式2)简单快速3)灵活4)无连接每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,断开连接.5)无状态协议不会记录服务器客户端状态. ...

  8. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  9. Http 和TCP的关系,TCP长连接和短连接有什么区别?

    HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...

随机推荐

  1. H5C301

    标题H5C301 1.html5 h5最新版本.所有主流浏览器都支持h5.但仅ie9及以上支持h5 改变了用户与文档的交互方式:多媒体 新增了其他的特性:语义,本地存储,网页多媒体 抛弃了不合理的标签 ...

  2. django之ORM补充

    本篇导航: QuerySet 中介模型 查询优化 extra 一.QuerySet 1.可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句 ...

  3. Deepin 15.4 个性化设置

    2017.10.03,开始使用 Deepin 15.4.1 桌面系统 Chrome 版本 60.0.3112.78(正式版本) (64 位) 1.开启 ls 别名: vim .bashrc 去掉以下代 ...

  4. C# Xamarin For Android自动升级项目实战

    一.课程介绍 “明人不说暗话,跟着阿笨一起玩Xamarin”,本次分享课程阿笨将带来大家一起学习Xamarin For Android系列<C# Xamarin For Android自动升级项 ...

  5. Git远程仓库地址变更本地如何修改

    以项目test为例: 老地址:http://192.168.1.1:9797/john/test.git 新地址:http://git.xxx.xxx/john/test.git 远程仓库名称: or ...

  6. AS使用lombok注解报错:Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.

    Rebuild时报错信息如下所示: Error:Execution failed for task ':app:javaPreCompileDebug'.> Annotation process ...

  7. C#使用HttpWebRequest和HttpWebResponse上传文件示例

    C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System;using System.Colle ...

  8. Python PhantomJS 爬虫 示例

    from selenium import webdriver# 请求url url = "https://auctions.freemansauction.com/auction-lot-d ...

  9. Atitit 支出分类表 会计科目(1)资产(2)负债(3)资本(4)收益(5)费用(成本) 资产分类表 attilax总结

    Atitit 支出分类表  会计科目(1)资产(2)负债(3)资本(4)收益(5)费用(成本)  资产分类表 attilax总结 会计科目对一般不懂会计的管理人员,常会有莫测高深的感觉,因此不仅不愿去 ...

  10. easyui中combobox 取值

    <input id="cmbstrTrainType" class="easyui-combobox" name="cmbstrTrainTyp ...