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 相关文章推荐
用缓存实现静态页面的测试
Dec 06 PHP
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
php中JSON的使用与转换
Jan 14 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP chr()函数讲解
Feb 11 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
Oct 22 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
一个SQL管理员的web接口
2006/10/09 PHP
php header Content-Type类型小结
2011/07/03 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
Python 调用Java实例详解
2017/06/02 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
六道php面试题附答案
2014/06/05 面试题
xml有哪些解析技术?区别是什么
2016/04/26 面试题
2014年创卫实施方案
2014/02/18 职场文书
高一学生期末评语
2014/04/25 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
乱丢垃圾袋检讨书
2014/10/08 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
小学教师节活动总结
2015/03/20 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
民事申诉状范本
2015/05/20 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
MySQL存储过程及语法详解
2022/08/05 MySQL