PHP生成短网址方法汇总


Posted in PHP onJuly 12, 2016

正常的网址带上参数的那种可能会很长,尤其是我们在印刷纸质品如企业宣传册中要印上某个长的url的话非常难看,而且也没几个人会去记这个网址,虽然现在可以用扫二维码的方式打开长网址。但是人们可以使用短网址来实现优美的链接,尤其是有字数限制的应用如微博。

短网址的实现原理就是有一个数据表会配置文件将短网址和实际网址进行对应,当请求某个短网址时,程序跳转到对应的实际网址上去,从而实现网址的访问。

方案1:PHP+MySQl实现短网址的生成和读取

常规的方案我们将生成好的短网址和原网址对应到一张数据表中,然后供读取使用。我们先来看如何生成唯一的短网址。

//生成短网址 
function code62($x){ 
  $show=''; 
  while($x>0){ 
    $s=$x % 62; 
    if ($s>35){ 
      $s=chr($s+61); 
    }elseif($s>9&&$s<=35){ 
      $s=chr($s+55); 
    } 
    $show.=$s; 
    $x=floor($x/62); 
  } 
  return $show; 
} 
function shorturl($url){ 
  $url=crc32($url); 
  $result=sprintf("%u",$url); 
  return code62($result); 
} 
echo shorturl('https://3water.com/'); 
//1EeIv2

使用以上PHP代码可以生成唯一的6位的短网址,然后我们将生成的短网址与原网址一起写入到MySQL表中,插入数据库的代码这里我就不写了,这是PHP基础。
接着,我们有一个link.php用来接收读取url并实现真实跳转。

include_once('connect.php'); //连接数据库 
$url = $_GET['url']; 
if(isset($url) && !empty($url)){ 
  $sql = "select url from shorturl where codeid='$url'"; 
  $query = mysql_query($sql); 
  if($row=mysql_fetch_array($query)){ 
    $real_url = $row['url']; 
    header('Location: ' . $real_url); 
  }else{ 
    header('HTTP/1.0 404 Not Found'); 
    echo 'Unknown link.'; 
  } 
}else{ 
  header('HTTP/1.0 404 Not Found'); 
  echo 'Unknown link.'; 
}

代码中,如果得到短网址对应的真实url,会使用header跳转到真实的页面上去,否则返回404代码。这样我们可以使用如: http://yourdomain/link.php?url=xxx来实现短网址访问。

继续,我们使用URL rewrite即重写功能来实现诸如可以通过地址:http://yourdomain/xxx 来访问。

以下是rewrite规则:

#Apache规则: 
RewriteRule ^/(.*)$ /link.php?url=$1 [L] 
 
#如果使用nginx,规则这样写: 
rewrite ^/(.*)$ /link.php?url=$1 last;

方案2:PHP+ini实现短网址技术

对于方案1使用数据库的做法好处就是操作方便,而大量短网址查询需要做优化。而方案2则放弃数据库,使用ini配置,我们将短网址和真实网址配置在ini文件中,PHP直接通过parse_ini_file()读取ini文件,几行代码就可以实现短网址的跳转。
links.ini文件像这样配置:

baidu  = https://www.baidu.com/ 
qq    = http://www.qq.com/ 
hw    = http://www.hw.com/ 
dm    = http://www.dm.com/view-blog-362.html

而index.php的代码可以这样写:

$links = parse_ini_file('links.ini'); 
 
if(isset($_GET['l']) && array_key_exists($_GET['l'], $links)){ 
  header('Location: ' . $links[$_GET['l']]); 
} 
else{ 
  header('HTTP/1.0 404 Not Found'); 
  echo 'Unknown link.'; 
}

当然,我们还需要配置下rewrite规则。

#Apache规则: 
RewriteRule ^/(.*)$ /index.php?l=$1 [L] 
 
#如果使用nginx,规则这样写: 
rewrite ^/(.*)$ /index.php?l=$1 last;

好了,我们现在访问网址:http://demo.3water.com/dm,它直接跳转到实际网址:https://3water.com/view-blog-362.html。
相比来说,第二种方案适合小型的应用,你还可以把url地址做成数组形式保存,还可以做一个管理界面专门维护这些短网址。

第三种方案:php版的短链接生成方法

<?php
function shorturl($input) {
$base32 = array (
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', '0', '1', '2', '3', '4', '5'
);
 
$hex = md5($input);
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = array();
 
for ($i = 0; $i < $subHexLen; $i++) {
//把加密字符按照8位一组16进制与0x3FFFFFFF(30位1)进行位与运算
$subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = '';
 
for ($j = 0; $j < 6; $j++) {
 
//把得到的值与0x0000001F进行位与运算,取得字符数组chars索引
$val = 0x0000001F & $int;
$out .= $base32[$val];
$int = $int >> 5;
}
 
$output[] = $out;
}
 
return $output;
}
?>

总结:

用户访问短网址 时的过程:

1、浏览器访问短网址http://short.cn/Xvdf23,经过DNS解析会指向到http://short.cn的服务器。
2、服务器根据短网址中的ID字段查找数据库,返回原始网址。
3、重定向到上面返回的原始网址

以上就是本文的全部内容了,希望大家能够喜欢

PHP 相关文章推荐
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
Oct 15 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
ThinkPHP3.1新特性之查询条件预处理简介
Jun 19 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
PHP实现对图片的反色处理功能【测试可用】
Feb 01 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 #PHP
微信支付开发告警通知实例
Jul 12 #PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 #PHP
微信支付开发发货通知实例
Jul 12 #PHP
thinkphp中的url跳转用法分析
Jul 12 #PHP
微信支付开发订单查询实例
Jul 12 #PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
Jul 12 #PHP
You might like
使用数据库保存session的方法
2006/10/09 PHP
php防攻击代码升级版
2010/12/29 PHP
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
JS比较2个日期间隔的示例代码
2014/04/15 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
js中less常用的方法小结
2017/08/09 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
vue多级复杂列表展开/折叠及全选/分组全选实现
2018/11/05 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python list操作用法总结
2015/11/10 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
2020/02/28 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
美国在线印刷公司:PsPrint
2017/10/12 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
化学教育专业求职信
2014/07/08 职场文书
新店开张活动方案
2014/08/24 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
交通事故代理词范文
2015/05/23 职场文书
大学生入党群众意见书
2015/06/02 职场文书