節省網址長度,便於社交化傳播。(短信或者微博,字數長度受限制時。這樣的短鏈接製作二維碼也是易於識別)
方便後臺跟蹤點擊量、地域分佈等用戶統計。(統計流量訪問,延伸可以做網址舉報屏蔽。只屏蔽短鏈接即可,控制輸出)
規避關鍵詞、域名屏蔽手段。
隱藏真實地址,適合做付費推廣鏈接。
實現思路:
將傳入的長鏈接存入數據庫中,並記錄創建時間,返回自增ID。
將返回的id進行10進制轉64進制編碼:如自增id爲10時,64進制轉換爲A;即使當我們記錄到1億條時,1億的64進製爲:F9eEA,才5個字符長度,非常適合作爲短鏈接的參數。然後組合成 http://域名/編碼參數/。我們既得到了短鏈接。當我們訪問短鏈接時,解析參數轉爲10進制。到數據庫中查找獲得相應的鏈接,進行301跳轉。此功能既爲完成。
步驟如下:
1、修改host文件->配置網站虛擬目錄->進行URL重寫1.1 修改hosts文件,將測試域名指向本機ip
- C:\Windows\System32\drivers\etc\hosts
- 127.0.0.1 d.cn
1.2 配置apache,添加虛擬域名映射,參考:http://blog.csdn.net/nuli888/article/details/51830659
- <VirtualHost *:80>
- DocumentRoot "D:/webroot/test/link"
- ServerName d.cn
- <Directory "D:/webroot/test/link">
- DirectoryIndex index.html index.php
- AllowOverride All
- Order deny,allow
- Allow from all
- </Directory>
- </VirtualHost>
- <VirtualHost *:80>
- DocumentRoot "D:/webroot"
- ServerName localhost
- <Directory "D:/webroot">
- DirectoryIndex index.html index.PHP
- AllowOverride All
- Order deny,allow
- Allow from all
- </Directory>
- </VirtualHost>
1.3 配置.htaccess文件,將短連接重定向,設置如下:
- <IfModule mod_rewrite.c>
- RewriteEngine on
- RewriteRule ^(\S{1,7})$ index.php?code=$1 [L]
- </IfModule>
URL短鏈接的實現原理和方法
2、增加64進制編碼與解碼方法:
func.PHP
- <?php
- function b64dec($b64) { //64進制轉換成10進制
- $map = array(
- '0'=>0,'1'=>1,'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,
- 'A'=>10,'B'=>11,'C'=>12,'D'=>13,'E'=>14,'F'=>15,'G'=>16,'H'=>17,'I'=>18,'J'=>19,
- 'K'=>20,'L'=>21,'M'=>22,'N'=>23,'O'=>24,'P'=>25,'Q'=>26,'R'=>27,'S'=>28,'T'=>29,
- 'U'=>30,'V'=>31,'W'=>32,'X'=>33,'Y'=>34,'Z'=>35,'a'=>36,'b'=>37,'c'=>38,'d'=>39,
- 'e'=>40,'f'=>41,'g'=>42,'h'=>43,'i'=>44,'j'=>45,'k'=>46,'l'=>47,'m'=>48,'n'=>49,
- 'o'=>50,'p'=>51,'q'=>52,'r'=>53,'s'=>54,'t'=>55,'u'=>56,'v'=>57,'w'=>58,'x'=>59,
- 'y'=>60,'z'=>61,'_'=>62,'='=>63
- );
- $dec = 0;
- $len = strlen($b64);
- for ($i = 0; $i < $len; $i++) {
- $b = $map[$b64{$i}];
- if ($b === NULL) {
- return FALSE;
- }
- $j = $len - $i - 1;
- $dec += ($j == 0 ? $b : (2 << (6 * $j - 1)) * $b);
- }
- return $dec;
- }
- function decb64($dec) { //10進制轉換成64進制
- if ($dec < 0) {
- return FALSE;
- }
- $map = array(
- 0=>'0',1=>'1',2=>'2',3=>'3',4=>'4',5=>'5',6=>'6',7=>'7',8=>'8',9=>'9',
- 10=>'A',11=>'B',12=>'C',13=>'D',14=>'E',15=>'F',16=>'G',17=>'H',18=>'I',19=>'J',
- 20=>'K',21=>'L',22=>'M',23=>'N',24=>'O',25=>'P',26=>'Q',27=>'R',28=>'S',29=>'T',
- 30=>'U',31=>'V',32=>'W',33=>'X',34=>'Y',35=>'Z',36=>'a',37=>'b',38=>'c',39=>'d',
- 40=>'e',41=>'f',42=>'g',43=>'h',44=>'i',45=>'j',46=>'k',47=>'l',48=>'m',49=>'n',
- 50=>'o',51=>'p',52=>'q',53=>'r',54=>'s',55=>'t',56=>'u',57=>'v',58=>'w',59=>'x',
- 60=>'y',61=>'z',62=>'_',63=>'=',
- );
- $b64 = '';
- do {
- $b64 = $map[($dec % 64)] . $b64;
- $dec /= 64;
- } while ($dec >= 1);
- return $b64;
- }
3、創建數據表links
- CREATE TABLE `links` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `url` varchar(255) DEFAULT NULL,
- `ctime` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM AUTO_INCREMENT=26262628 DEFAULT CHARSET=latin1;
- -- ----------------------------
- -- Records of links
- -- ----------------------------
- INSERT INTO `links` VALUES ('10900', 'http://www.cnblogs.com', '1489568387');
- INSERT INTO `links` VALUES ('10901', 'http://www.baidu.com', '1489569782');
index.php
- <?php
- include 'func.php';
- define("HOST","localhost");
- define("DB_NAME","test");
- define("USER","root");
- define("PASS","123456");
- function make_short_url($url){
- $url=str_ireplace("http://","",$url);
- $pdo = new PDO("mysql:host=".HOST.";dbname=".DB_NAME,USER,PASS);
- $rs = $pdo ->query("select id from links where url='".$url."'");
- $row = $rs -> fetch();
- if($row==false){
- $pdo -> exec("insert into links(url,ctime) values('".$url."','".mktime()."')");
- $id=$pdo -> lastinsertid();
- return "http://d.cn/".decb64($id);
- }else{
- return "http://d.cn/".decb64($row['id']);
- }
- }
- function get_long_url($code){
- $pdo = new PDO("mysql:host=".HOST.";dbname=".DB_NAME,USER,PASS);
- $rs = $pdo ->query("select url from links where id='".b64dec($code)."'");
- $row = $rs -> fetch();
- if($row==false){
- print "鏈接錯誤";
- exit;
- }else{
- return "http://".$row['url'];
- }
- }
- //參數的接收與短鏈接返回部分
- if($_GET['code']){
- $code=trim($_GET['code'],"/");
- $url=get_long_url($code);
- if($url){
- header("location:$url");
- }
- }elseif($_GET['url']){
- $url=trim($_GET['url']);
- print make_short_url($url);
- }
5、測試
返回內容爲:http://d.cn/2gL。在瀏覽器中訪問http://d.cn/2gL,即會跳轉到http://www.baidu.com
一個短鏈接已經基本實現,仍然有一些可待優化的地方。如跳轉方式改爲301跳轉;數據庫數據量大時,可以採取分庫操作。或者用memcache或者Redis緩存服務器來代替MySQL,提升效率等等