PHP實現URL長連接轉短連接方法總結
短鏈接,通俗來說,就是將長的URL 網址,通過程序計算等方式,轉換為簡短的網址字符串。
這樣的話其好處為:1、內容需要;2、用戶友好;3、便於管理。
實現短網址(short URL)系統比較流行的算法有兩種 自增序列算法、 摘要算法
自增序列算法:
自增序列算法 也叫永不重復算法
設置 id 自增,一個 10進制 id 對應一個 62進制的數值,1對1,也就不會出現重復的情況。這個利用的就是低進制轉化為高進制時,字符數會減少的特性。
摘要算法:
1、將長網址 md5
生成 32 位簽名串,分為 4 段, 每段 8 個字節
2、對這四段循環處理, 取 8 個字節, 將他看成 16 進制串與 0x3fffffff(30位1) 與操作, 即超過 30 位的忽略處理
3、這 30 位分成 6 段, 每 5 位的數字作為字母表的索引取得特定字符, 依次進行獲得 6 位字符串
4、總的 md5
串可以獲得 4 個 6 位串,取裏面的任意一個就可作為這個長 url 的短 url 地址
這種算法,雖然會生成4個Code,但是仍然存在重復幾率
以上兩種算法具體實現原理參考:短網址(short URL)系統的原理及其實現
依據第二種算法,URL長連接轉短連接實現方法如下:
語言:PHP5.6
服務器環境:LNMP
假設:長連接地址:http://www.test.com/index.php
短連接地址:http://t.test.com/六位code碼
第一步:利用shortUrl()函數,生成短連接Code碼,並將數據存入Mysql數據庫;
函數shorturl():
<?php /** * 由長連接生成短鏈接操作 * * 算法描述:使用6個字符來表示短鏈接,我們使用ASCII字符中的‘a‘-‘z‘,‘0‘-‘9‘,‘A‘-‘Z‘,共計62個字符做為集合。 * 每個字符有62種狀態,六個字符就可以表示62^6(56800235584),那麽如何得到這六個字符, * 具體描述如下: * 1. 對傳入的長URL+設置key值 進行Md5,得到一個32位的字符串(32 字符十六進制數),即16的32次方; * 2. 將這32位分成四份,每一份8個字符,將其視作16進制串與0x3fffffff(30位1)與操作, 即超過30位的忽略處理; * 3. 這30位分成6段, 每5個一組,算出其整數值,然後映射到我們準備的62個字符中, 依次進行獲得一個6位的短鏈接地址。 **/ function shortUrl( $long_url ) { $key = ‘swz0823‘; //自定義key值 $base32 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 利用md5算法方式生成hash值 $hex = hash(‘md5‘, $long_url.$key); $hexLen = strlen($hex); $subHexLen = $hexLen / 8; $output = array(); for( $i = 0; $i < $subHexLen; $i++ ) { // 將這32位分成四份,每一份8個字符,將其視作16進制串與0x3fffffff(30位1)與操作 $subHex = substr($hex, $i*8, 8); $idx = 0x3FFFFFFF & (1 * (‘0x‘ . $subHex)); // 這30位分成6段, 每5個一組,算出其整數值,然後映射到我們準備的62個字符 $out = ‘‘; for( $j = 0; $j < 6; $j++ ) { $val = 0x0000003D & $idx; $out .= $base32[$val]; $idx = $idx >> 5; } $output[$i] = $out; } return $output; } $url = ‘http://www.test.com/index.php‘;//長連接 $ret = shortUrl($url); var_dump($ret); ################ 打印結果 ################ /* array(4) { [0]=> string(6) "2aEzqe" [1]=> string(6) "Rj6Bve" [2]=> string(6) "f2mQvi" [3]=> string(6) "z2eqYv" } */ #將長連接url與短鏈接Code結果存入數據庫,取其中一個用於顯示即可。例:短連接地址:http://t.test.com/2aEzqe
數據庫結構(可自定義):
CREATE TABLE `long_short_url` ( `id` int(32) unsigned NOT NULL AUTO_INCREMENT, `long_url` varchar(255) DEFAULT NULL, `short_url_code` varchar(255) DEFAULT NULL, `create_time` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=utf8;
第二步:服務器301/302重定向Api接口如下,(假如此Api接口地址:http://www.test.com/api/longUrl?code=六位code碼)
public function longUrl(){ $map[‘short_url‘] = $_GET[‘code‘]; $data =M(‘long_short_url‘)->where($map) ->find(); $url = $data[‘long_url‘]; header("location:$url"); }
第四部:修改Nginx服務器nginx.conf配置文件
在底部(任意位置)增添以下代碼:
server { listen 80; server_name t.test.com; rewrite ^/(.*) http://www.test.com/Api/longUrl?code=$1 redirect; access_log off; }
然後保存,重啟Nginx服務器。
當我們請求通過短連接地址:
http://t.test.com/2aEzqe時, 服務器會通過Code短碼 2aEzqe 獲取對應的長 URL,並通過HTTP 301/302重定向到對應的長連接地址;
另外:
1.自增序列算法實現方法參考實例:php實現短鏈接系統
2.PHP開源短連接生成系統:YOURLS
YOURLS (Your Own URL Shortener) 是一款使用PHP+Mysql開發的短鏈接程序,讓你可以輕松建立屬於自己的短網址生成系統。而無需第三方平臺你就可以獲得所有的數據統計,並且支持一系列插件擴展。
安裝流程:
- 將安裝包解壓並上傳至服務器;
- 將
user/config-sample.php
重命名為user/config.php
; - 編輯
user/config.php
文件,填入數據庫信息和配置站點等選項; - 訪問
http://yoursite.com/admin/
即可!
PHP實現URL長連接轉短連接方法總結