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 Pear 安装及使用
Mar 19 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
php知道与问问的采集插件代码
Oct 12 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
PHP中判断变量为空的几种方法分享
Aug 26 PHP
header导出Excel应用示例
Jan 24 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
[原创]php实现 data url的图片生成与保存
Dec 04 PHP
PHP微信模板消息操作示例
Jun 29 PHP
PHP中的浅复制与深复制的实例详解
Oct 26 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
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
javascript div 弹出可拖动窗口
2009/02/26 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
python datetime中strptime用法详解
2019/08/29 Python
python实现XML解析的方法解析
2019/11/16 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
革命先烈的英雄事迹材料
2014/02/15 职场文书
欢迎领导检查标语
2014/06/27 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
教研活动主持词
2015/07/03 职场文书
运动会入场词
2015/07/18 职场文书
关于教师节的广播稿
2015/08/19 职场文书
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS