短域名好处与短域名的实现
在日常的工作中经常会看到很多的短域名,前几天看到一篇文章是面试题目有一道题目说是,你来说说,短域名的好处,以及实现思路,突然觉得有必要了解一下.
首先来说说短域名的好处,最后说说实现思路,最后来一个短域名的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'];
}
以上就是码字一小时,成果,有复制请转载出处。