其实这货已经弄好很久了 =.= 虽然已经弄好了,不过 bug 还不是一般的多啊……算了不管它了,先发上来凑凑字数吧 =.=……
其实本来有考虑过不依托数据库的,不过貌似不这样就不好去重……而且用 txt 保存数据调用略麻烦,建立文件夹管理略麻烦,所以还是只能用 mysql 了……
由于本人技术过渣,请手动配置……
- 通过 phpmyadmin 等程序在数据库中新建一个表,表名随意(此处以 sheet 为例),然后设置如下结构:
字段:surl,类型:TEXT,整理:utf8_general_ci
字段:lurl,类型:TEXT,整理:utf8_general_ci - 保存后将后面提到的两个文件上传到网站的根目录下
- 设置 .htaccess 文件如下(其实就是 WordPress 的 htaccess OTL):
12345678910php_value default_charset utf8<IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRule ^index\.php$ - [L]#RewriteCond %{REQUEST_URI} !^(add.*|\?.*|) [NC]RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php\?url=$1 [L]</IfModule>
然后是那两个文件……
首先肯定是前台页……前台页既担当着导航的功能,也担当着跳转页面的功能……获取短链 url 的方式是将当前用户提交的 url 提交至 add/index.php 下,然后通过 XMLHttpRequest 获取数据……至于前台页的美化我就不管了 =.= 将该文件放于站点根目录……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<?php if($_SERVER['REQUEST_URI']){ //判断是否为短链接 $url=str_replace('/','',$_SERVER['REQUEST_URI']); //获取短链接字段(surl) $connect=mysql_connect('localhost','username','password'); //在此处设置 MySQL 服务器、用户名和密码 if(!$connect)die('Could not connect: '.mysql_error()); mysql_select_db('database',$connect); //在此处设置数据库 $sql='SELECT * FROM sheet WHERE surl = "'.$url.'"'; //查询是否存在短链,将 sheet 设置为数据表名 mysql_query("set names 'utf8'"); //以 UTF8 编码连接 $result=mysql_query($sql); if($result){ if($row=mysql_num_rows($result)){ while($row=mysql_fetch_array($result)){ $url2=$row['lurl']; //如果存在短链则获取原始链接 } } else $url2=$_SERVER['HTTP_HOST']; //否则转回站点首页 } mysql_close($connect); header('Location: '.$url2); //重定向至目标页面 } //echo $url; ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>URL 短链</title> </head> <body style="text-align:center"> <header><h1>URL 短链</h1></header> <hr> <form action="./add/" method="get" name="form" onSubmit="return false"> <!-- 提交数据时返回,同时触发之后的提交函数 --> <input type="text" id="url" name="url" style="width:100%;max-width:600px;height:40px;font-size:16px;padding:0 10px;margin:10px" placeholder="在此处输入欲缩短的网址(*)"> <br> <input type="text" id="url2" name="url2" style="width:100%;max-width:600px;height:40px;font-size:16px;padding:0 10px;margin:10px" placeholder="在此处输入自定义链接"> <br> <input id="submit" type="submit" style="width:100%;max-width:200px;height:40px;font-size:16px;margin:20px" value="生成"> </form> <div id="result" style="margin-bottom:25px"></div> <footer>Copyright (c) 2013 864907600cc</footer> <script> function post(url,url2){ //提交函数 document.getElementById("result").innerHTML='<p align="center">'+url+' 正在缩短链接中……</p>'; //获取短链时的等待信息 var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(){ if (xhr.readyState==4 && xhr.status==200){ document.getElementById("result").innerHTML=xhr.responseText; //输出获取的信息 } } if(url2!=null)xhr.open('GET','add?url='+url+'&url2='+url2,true); //如果设置了自定义链接则同时传递原链接和自定义链接 else xhr.open('GET','add?url='+url,true); //否则只传递原链接 xhr.send(); } document.getElementById('submit').onclick=function(event){ if(document.getElementById('url').value.length>0){ //判断是否输入了链接 if(!/^http(s)?:\/\//.test(document.getElementById('url').value))document.getElementById('url').value='http://'+document.getElementById('url').value; //判断开头是否附有 http(s)://,若无则添加(FTP 之类的死一边去 =.=) if(/\w{1,}/.test(document.getElementById('url2').value))post(document.getElementById('url').value,document.getElementById('url2').value); //如果设置了自定义链接则将原链接和自定义链接传递给提交函数 else if(/http(s)?:\/\/\w{1,}/.test(document.getElementById('url').value))post(document.getElementById('url').value); //否则只传递原链接 } else{ //若未输入链接则返回 return false; } } </script> </body> </html> |
之后是后台处理页……后台在接收到数据后会连接数据库,同时生成一个四位随机字符备用。如果提交的 url 已经存在,则直接返回短链,否则写入数据库生成新的短链;而如果提交的自定义短链 url 已经存在,则会用生成的四位随机字符生成新的短链 =.= 将该文件放于根目录下 add 文件夹……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
<?php if(!isset($_GET['url']))die('Forbidden'); //如果未提交 url(如蜘蛛访问)则输出 Forbidden(403 要改 header 太麻烦了← ←参考福利发布平台的编辑页吧【喂不是还没有发布么) $connect=mysql_connect('localhost','username','password'); //设置数据库服务器、用户名和密码,同上 if(!$connect)die('Could not connect: '.mysql_error()); mysql_select_db('database',$connect); //设置数据库名,同上 // 该字段生成随机字符,可按需增减字符和修改长度,方法来自网络 $chars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_+.'; $surl_c=''; for($i=0;$i<4;$i++){ $surl_c .= $chars[ mt_rand(0, strlen($chars) - 1) ]; } $url=$_GET['url']; //定义原链接 if($_GET['url2']==''||$_GET['url2']==null)$url2=$surl_c; //定义自定义短链,如果不存在则设置为随机字符 else $url2=$_GET['url2']; $sql='SELECT * FROM sheet WHERE lurl = "'.$url.'"'; //查询是否存在原始链接,修改 sheet 为数据表名,同上 mysql_query("set names 'utf8'"); //以 UTF8 编码连接 $result=mysql_query($sql); if($result){ if($row=mysql_num_rows($result)){ while($row=mysql_fetch_array($result)){ //如果存在短链,直接返回 $surl=$row['surl']; break; } } else{ //否则…… $sql2='SELECT * FROM sheet WHERE surl = "'.$url2.'"'; //查询是否存在冲突的自定义短链,修改 sheet 为数据表名,同上 mysql_query("set names 'utf8'"); $result2=mysql_query($sql2); if($result2){ if($row2=mysql_num_rows($result2)){ while($row2=mysql_fetch_array($result2)){ //如果存在则定义短链接为之前的随机字符(喂等等如果是之前的随机字符冲突呢!) $surl=$surl_c; break; } } else{ //否则定义短链接为之前提交的自定义链接 $surl=$url2; } $sql3='INSERT INTO sheet (surl,lurl) VALUES ("'.$surl.'","'.$url.'")'; //写入短链接至数据库,修改 sheet 为数据表名,同上 mysql_query("set names 'utf8'"); $result3=mysql_query($sql3); if(!$result3)die(mysql_error()); } else die(mysql_error()); } } else die(mysql_error()); echo 'URL 短链:<a href="http://'.$_SERVER['HTTP_HOST'].'/'.$surl.'">http://'.$_SERVER['HTTP_HOST'].'/'.$surl.'</a>'; //输出短链接 mysql_close($connect); ?> |
目前已知 bug……
- 不支持中文 =.=
- 可能不支持大小写区分
- 可能会出现生成的随机字符冲突问题
- 设置较长的自定义短链接可能会出现用随机字符做短链的问题
- ……想不出来了_(:з」∠)_
预览效果……
- 首页:http://太过虚幻.com.nu
- 自动生成的短链:http://太过虚幻.com.nu/_++Z
- 自动生成的短链:http://太过虚幻.com.nu/fMaH
- 自定义短链:http://太过虚幻.com.nu/TaiGuoXuHuan
- 自定义短链:http://太过虚幻.com.nu/gay
顺便数一下那些准备发布但目前已经放置 play 的项目吧 _(:з」∠)_
1. 福利发布平台(已完成 95%,已放置 3 个月以上)
2. crxcheck(已完成,已放置 2 个月以上)
3. 新版 BGM 样式(已完成 85%,已放置 2 周)
4. 原定今天发布的某张无节操抠图,结果忘了_(:з」∠)_(已被 PS 的快速选择工具坑到导致出现锯齿,已放置 3 天)
@864907600cc 图片有锯齿就尝试在轮廓那加点阴影过渡吧。
短链不支持中文是因为没有 rawurldecode() ,接收的都是 %xx 么?
太长的不叫短链当然要截短了。
那个 .$url. 表示 addslashes() 后的链接么?→_→
@Jak Wings 假如 PHP 支持 mb_* 函数,可以用来数中文的长度。
@Jak Wings 图片有锯齿果断截原图拼上去 ← ← 没有设置好快速选择工具,后来用套索工具一步步抠图就没事……
是的,接收的都是 %xx / \ 但是我没有设置长度限制啊……其实这货实际上只是个自动重定向页面的程序而已……
$url 没有用 addslashes 转义,直接提交的 / \
mb_api?我觉得 subdomain 的服务器没有这么高级 =.=
@864907600cc http://www.php.net/manual/en/function.mb-strlen.php
可以用探针看看。
长度限制只是限制创建的短链~
@Jak Wings 不管它了,不想填坑了 / \
@864907600cc (╯-_-)╯╧╧
@Jak Wings 桌子是无辜的 0.0
@Jak Wings 话说 GMail 的限制真烦 =.=
@864907600cc 桌子接住~
邮件提醒的样式又改了 -_- GMail 啥限制?图片么?
@Jak Wings 被砸死了 X_X
style 标签清空就算了,HTML 5 标签也会被清,box-shadow、background、position css 属性也会被清,真心无奈← ←
@864907600cc background 还在啊 →_→ 只是没图片……
@Jak Wings 其实标准样式应该是一个渐变条纹……
图片是 Gravatar 的……
@864907600cc 好难看的条纹 ;→ →
@Jak Wings 本来想要斜线的,该死的 chrome 渲染有问题
@864907600cc Gmail CheckerPlus 扩展上不带图片的显示,好看多了:http://uploadpie.com/BBZEl
qq.my是个啥东西
@天羽ちよこ 一个域名,不过现在貌似无法解析了
@864907600cc 我这打开正常……Sun Java™ System Web Server 7.0
@864907600cc 原来你说的是太过虚幻….
难道没有正则来验证url是否合法么…..
@天羽ちよこ 不想填坑了 / \
@864907600cc (ノ=Д=)ノ┻━┻ (ノ*・ω・)ノ
php有专门的函数来判断url是否合法,首先用parse_url()分解url在用filter_validate_url()来验证url是否合法,再用get_headers()判断200头来确定文件是否存在,只有经过这样的判断之后才算是一个合法的url
测定长度可以urlencode()后用strlen来判断
此外,你完全可以用域名的md5来算出唯一的值来做随机,而且保证不会重复
html_mail的标准还停留在03年前的标准,太复杂的阅读器是解析不了的
中文的是带编码的函数 例如 太过虚幻.com.nu=xn--sssq7j484b04h.com.nu,路径的编码要用urldecode()或rawurldecode()来解码才能正确解析