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下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
php操作redis缓存方法分享
Jun 03 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
PHP 中常量的知识整理
Apr 14 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 PHP
PHP常量及变量区别原理详解
Aug 14 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
jQuery下的几个你可能没用过的功能
2010/08/29 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
JavaScript中window.open用法实例详解
2015/04/15 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
django中的数据库迁移的实现
2020/03/16 Python
Python AutoCAD 系统设置的实现方法
2020/04/01 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
酒店管理毕业生自荐信
2013/10/24 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
社团个人总结范文
2015/03/05 职场文书
给朋友的道歉短信
2015/05/12 职场文书
新郎新娘致辞
2015/07/31 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
postgres之jsonb属性的使用操作
2021/06/23 PostgreSQL
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
nginx七层负载均衡配置详解
2022/07/15 Servers
SQLServer常见数学函数梳理总结
2022/08/05 MySQL