短域名好处与短域名的实现

作者: Darren 分类: 学习 发布时间: 2019-09-05 17:55

在日常的工作中经常会看到很多的短域名,前几天看到一篇文章是面试题目有一道题目说是,你来说说,短域名的好处,以及实现思路,突然觉得有必要了解一下.

首先来说说短域名的好处,最后说说实现思路,最后来一个短域名的domo是调用别人接口的.

一、短域名的好处:

1、更容易记忆,与整洁

在页面上或者在海报上,能够清晰明了,不会很长,而且也方便记忆

2、节省网站空间的空间

如果一个连接在网站上,一个连接多处了几个字符,那么假如网站有6000千多个连接,一个链接多几个,那么很多个链接,就节省了数据库的空间了.

3、便于在社交软件以及其他地方用户发表

新浪以及发表说说的社交软件都会有字符限制,如果使用短连接,就可以使得用户可以方便网址,不然一个连接非常长,那么就会导致用户分享不了.

4、匿名访问,不会暴露真实地址

短连接,可以隐藏真实地址,如果在手机端访问的时候,由于手机很多app嵌入式的浏览器,这样可以实现连接隐藏,使得访问更安全

5、开启统计

短连接可以加入一个统计的功能,方便渠道统计,以及方便推广人员访问

6、方便推广

在推广过程中,很容易会出现某些连接被屏蔽,或者失效,那么短连接就实现,快速的更新与修改,避免之前的推广付出东流

7、设置访问密码

有些链接可以设置需要密码访问,这样就达到让特定的人访问

8、设置某些网址的上限比如只访问一次就失效

可以设置某些短连接在被访问后就失效,实现一次访问失效功能

9、禁止区域访问

可以设置禁止某些地区访问,这个需要加入一个获取用户的ip功能,然后根据用户ip来判断让不让用户访问

10、可以设置广告,植入一些推广

当然如果短连接,可以访问一些广告,当然也可以放入企业的logo,实现品牌推广,也可以放入广告赚点广告费

二、短域名的实现:

思路1:php+数据库

通过数据库的来对应每一个链接,从而实现短连接

//生成短网址
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('http://www.321dz.com');
//1EeIv2

以上生成短连接的函数,可以生成唯一的6位的短网址,然后将生成的短网址与原来的网址写入到mysql中,插入数据库的代码不写了.

接着,用一个url.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://www.321dz.com/dm,它直接跳转到实际网址:https://www.321dz.com/1968.html。
相比来说,第二种方案适合小型的应用,你还可以把url地址做成数组形式保存,还可以做一个管理界面专门维护这些短网址。

 

思路3: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://www.321dz.com/Xvdf23,经过DNS解析会指向到http://www.321dz.com的服务器。
2、服务器根据短网址中的ID字段查找数据库,返回原始网址。
3、重定向到上面返回的原始网址

 

三、短域名的DEMO

自己写的,技术水平有限,不好那就别用,这个是别人的接口。

代码:

<?php
public  function dwz($url= 'http://www.baidu.com')
        {
            $param = [
                'source'=> 'http://www.baidu.com',
                'https' =>1,
                'alias'=>'',
            ];
            // 初始化
            $ch = curl_init('http://www.h5ip.cn/Index/addAddress');
            // 设置发送类型
            curl_setopt($ch, CURLOPT_POST, true);
            // 设置发送的post数据
            curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
            // 设置返回数据类型
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            //  执行线程
            $res = curl_exec($ch);
            if (!$res) {
                // 这里是错误的
                $msg = curl_error($ch);
                return $msg;
            }
            // 销毁线程
            curl_close($ch);

            // 返回结果
            $res = json_decode($res,true);
            if ($res['code']!=0&&empty($res['short_url'])) {

                return '接口失效了';
            }
            return $res['short_url'];
        }

 

以上就是码字一小时,成果,有复制请转载出处。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注