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实现像JSP,ASP里Application那样的全局变量
Jan 12 PHP
PHP时间戳使用实例代码
Jun 07 PHP
特详细的PHPMYADMIN简明安装教程
Aug 01 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
php中session使用示例
Mar 29 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
Aug 16 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
详解Yaf框架PHPUnit集成测试方法
Dec 27 PHP
PHP中OpenSSL加密问题整理
Dec 14 PHP
Django中通过定时任务触发页面静态化的处理方式
Aug 29 PHP
PHP实现的日历功能示例
Sep 01 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 文件上传全攻略
2010/04/28 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
php求正负数数组中连续元素最大值示例
2014/04/11 PHP
javascript 正则替换 replace(regExp, function)用法
2010/05/22 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
JavaScript中ES6字符串扩展方法
2016/08/26 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
2017/11/11 jQuery
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
python脚本设置系统时间的两种方法
2016/02/21 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
python数据处理实战(必看篇)
2017/06/11 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
中国旅游网站:同程旅游
2016/09/11 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
物流经理自我评价
2013/09/23 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
对讲机的最大通讯距离是多少
2022/02/18 无线电