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守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
PHP 并发场景的几种解决方案
Jun 14 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 PHP
设定php简写功能的方法
Nov 28 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脚本
2006/11/26 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
Javascript 布尔型分析
2008/12/22 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
vue实现购物车小案例
2019/09/27 Javascript
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
简化Python的Django框架代码的一些示例
2015/04/20 Python
Python简单进程锁代码实例
2015/04/27 Python
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
Python流程控制常用工具详解
2020/02/24 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
keras:model.compile损失函数的用法
2020/07/01 Python
音乐系毕业生自荐信
2013/10/27 职场文书
英文留学推荐信范文
2014/01/25 职场文书
铁路工务反思材料
2014/02/07 职场文书
《最可爱的人》教学反思
2014/02/14 职场文书
财产保全担保书范文
2014/04/01 职场文书
安全生产计划书
2014/05/04 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript