短網址探究,網址探究_PHP教程

來源:互聯網
上載者:User

短網址探究,網址探究


引言

  短網址司空見慣,比如說下面這些

  http://dwz.cn/CSW6Y => http://www.cnblogs.com/iforever/p/4313704.html,

  http://dwz.cn/CSWuP => http://www.cnblogs.com/iforever/p/4279006.html ,等等

  訪問這些網址的時候,前後一對的指向同一個頁面,我這裡只是在舉例子,這些短網址在weibo或者類似的社交網路中經常見到,由於原始連結地址特別長,這個時候短網址就會大顯威力,簡短好記,但也有他的缺點,比如說短網址不一定直接看出網址中的一些資訊(在長網址中是可以看到一些資訊的)。

  整天接觸這個,以至於在還沒有真正弄明白他的原理的時候就在思想中烙下了“沒什麼”的烙印,這就錯過了一些知識,這種情況在心理學上應該叫心裡暗示吧,有人知道是這樣嗎?

原理

  首先我猜測這個是通過重新導向實現的,dwz.cn是一個伺服器,用來接收一些短網址,這些短網址是經過dwz.cn處理之後的,在dwz.cn中有該短網址對應的長網址的記錄,然後從資料庫中擷取短網址對應的長網址,然後302重新導向。看看具體是不是這樣的。

  通過瀏覽器訪問http://dwz.cn/CSW6Y,對請求進行分析(這裡使用chrome的調試工具,也可以使用wireshark之類的工具),可以得到下面的資料:

name: abitversion: 1handle:- rewrite: if (!-d && !-f && path ~ "/(.*)$") goto "do.php?url=$1&act=out"

  handle:後面的就是rewrite規則,新浪雲的具體的詳細規則到這裡看http://sae.sina.com.cn/doc/php/runtime.html#php-app-config,很簡單,nginx、apache的配置也類似。

  重新導向完成之後還有一個要注意的地方就是在傳遞參數的時候要進行urlencode,重新導向之前要用urldecode。在未使用urlencode的時候傳遞url類型的參數,在擷取的時候可能丟掉部分資訊,因此在產生短連結之前傳遞參數的時候要將url進行escape處理,將特殊字元串進行編碼,在訪問短連結處理的時候需要對編碼的url進行urldecode處理,還原成正常的連結,否則在header跳轉的時候不會把該連結當成一個正常的url,跳轉之後會把該url附加的之前頁面的主機後面類似http://abit.sinaapp.com/www.cnblogs.com,可能會出現錯誤,因此,這裡要特別注意。

  sae的在重新導向的時候會有一個問題,會將雙反斜線自動過濾為一個,例如從http://abit.sinaapp.com/到http:/abit.sinaapp.com/,注意,這裡少了個反斜線,這在處理的時候要特別注意,不然可能會遇到不必要的麻煩。

編碼

  主要的處理部分

phpclass snapshotUrl{    //進行編碼的資料庫,沒6位位元對應一個字元,一共需要64位,因此選取    //52+10+2個特殊字元    private static $basedb = 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','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',        '6','7','8','9',    );    private function long2short($url){        $hex = md5($url);        $out = '';        $hex = 0x7FFFFFFF & (1 * ('0x'.substr($hex, 0, 8)));        for($i=0; $i<5; $i++){            $index = 0x3f & $hex;            $out .= self::$basedb[$index];            $hex = $hex>>6;        }        return $out;    }    public function retJson($arr){        return json_encode($arr);    }    //對url進行映射儲存    public function dispose($url, $act){        $mysql = new SaeMysql();        switch ($act) {            case 'in':                $short = $this->long2short($url);                $url = addslashes($url);                $sql = "insert into `tiny_url`(`short`,`long`) values ('{$short}','{$url}')";                $mysql->runSql($sql);                if($mysql->errno() != 0){                    echo "產生失敗";                }else{                    echo "http://abit.sinaapp.com/{$short}";                }                break;            case 'out':                if(strlen($url) > 5)                    echo $this->retJson(array("code"=>"-1","msg"=>"沒有這條記錄"));                $sql = "select * from `tiny_url` where `short`='{$url}' limit 1";                $data = $mysql->getData($sql);                if(!$data) {                    echo $this->retJson(array("code"=>"-1","msg"=>"沒有這條記錄"));                }else{                    $location = urldecode($data[0]['long']);                    header("Location: {$location}");                    exit();                }                break;                        default:                # code...                break;        }    }    }$url = isset($_GET['url']) ? $_GET['url'] : null;$act = isset($_GET['act']) ? $_GET['act'] : null;$snapshotUrl = new snapshotUrl();if($url === null || $act === null)    echo $snapshotUrl->retJson(array("code"=>"-1","msg"=>"參數錯誤"));$snapshotUrl->dispose($url, $act);

結果

  我做了個可以測試的小網頁:

  http://abit.sinaapp.com/有興趣的可以試試

  本文著作權歸作者iforever(luluyrt@163.com)所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文串連,否則保留追究法律責任的權利。

http://www.bkjia.com/PHPjc/965023.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/965023.htmlTechArticle短網址探究,網址探究 引言 短網址司空見慣,比如說下面這些 http://dwz.cn/CSW6Y=http://www.cnblogs.com/iforever/p/4313704.html, http://dwz.cn/CSWuP=http:/...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.