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极大的增强功能和性能
Oct 09 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
Jan 02 PHP
快速配置PHPMyAdmin方法
Jun 05 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
Jun 05 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
php实现文件下载代码分享
Aug 19 PHP
分享ThinkPHP3.2中关联查询解决思路
Sep 20 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
掌握PHP垃圾回收机制详解
Mar 13 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
PHP加密解密类实例分析
2015/04/20 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
解决html input验证只能输入数字,不能输入其他的问题
2017/07/21 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
JS实现网页烟花动画效果
2020/03/10 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
flask session组件的使用示例
2018/12/25 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
python asyncio 协程库的使用
2021/01/21 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
数据库专业英语
2012/11/30 面试题
高二政治教学反思
2014/02/01 职场文书
精神文明建设标语
2014/06/16 职场文书
2014年组织部工作总结
2014/11/14 职场文书
年度考核表个人总结
2015/03/06 职场文书
深入解析MySQL索引数据结构
2021/10/16 MySQL
Win10 Anaconda安装python-pcl
2022/04/29 Servers