怎么把網(wǎng)址縮短,但不改變域名?方法來(lái)了!
時(shí)間:2023-02-07 14:04:01 | 來(lái)源:建站知識(shí)
時(shí)間:2023-02-07 14:04:01 來(lái)源:建站知識(shí)
什么是短鏈接短鏈接,通俗來(lái)說(shuō),就是將長(zhǎng)的URL網(wǎng)址,通過(guò)程序計(jì)算等方式,轉(zhuǎn)換為簡(jiǎn)短的網(wǎng)址字符串。
大家經(jīng)??梢詮奈⒉┗蛘吒黝悹I(yíng)銷短信中,看到短鏈接,形式一般類似于
t.cn/xxxxxx
,點(diǎn)擊后,就能跳轉(zhuǎn)到對(duì)應(yīng)的頁(yè)面。
早期短鏈接廣泛應(yīng)用于圖片上傳網(wǎng)站,通過(guò)縮短網(wǎng)址URL鏈接字?jǐn)?shù),達(dá)到減少代碼字符串的目的。更便于使用者引用網(wǎng)址,寫入代碼中,節(jié)省字符數(shù)空間。常見于網(wǎng)店圖片分類的使用,因有字符限制,運(yùn)用短鏈接,達(dá)到外鏈圖片的目的,自微博盛行以來(lái),在微博字?jǐn)?shù)有限的特色下,短鏈接也盛行于微博網(wǎng)站,以節(jié)省字?jǐn)?shù),給博主發(fā)布更多文字的空間。
將長(zhǎng)鏈接轉(zhuǎn)成短鏈接,一般是為了方便記憶或者傳播。
需要完成的功能
從上面的介紹中,我們得出,縮短網(wǎng)址需要完成以下兩個(gè)功能點(diǎn):
- 將長(zhǎng)網(wǎng)址縮短成短鏈接
- 點(diǎn)擊生成短鏈接,能正常跳轉(zhuǎn)到原來(lái)的長(zhǎng)網(wǎng)址頁(yè)面
全流程設(shè)計(jì)
其實(shí)上述功能點(diǎn)的原理很簡(jiǎn)單,簡(jiǎn)單描述一下:
- 用戶輸入長(zhǎng)網(wǎng)址,服務(wù)端接收后進(jìn)行處理,并根據(jù)長(zhǎng)網(wǎng)址的內(nèi)容,生成一個(gè)短碼,并將映射關(guān)系進(jìn)行存儲(chǔ)。然后根據(jù)短碼拼接出短鏈接,返回給用戶;
- 用戶點(diǎn)擊短鏈接,服務(wù)器端根據(jù)短鏈接中的短碼,查找到對(duì)應(yīng)的長(zhǎng)網(wǎng)址,并302跳轉(zhuǎn)到對(duì)應(yīng)的頁(yè)面。
知識(shí)點(diǎn):為什么要使用302跳轉(zhuǎn),而不是301跳轉(zhuǎn)呢?301是永久重定向,302是臨時(shí)重定向。短地址一經(jīng)生成就不會(huì)變化,所以用301是符合http語(yǔ)義的。但是如果用了301, Google,百度等搜索引擎,搜索的時(shí)候會(huì)直接展示真實(shí)地址,那我們就無(wú)法統(tǒng)計(jì)到短地址被點(diǎn)擊的次數(shù)了,也無(wú)法收集用戶的Cookie, User Agent 等信息,這些信息可以用來(lái)做很多有意思的大數(shù)據(jù)分析,也是短網(wǎng)址服務(wù)商的主要盈利來(lái)源。
整個(gè)流程的設(shè)計(jì)如下圖所示:
可以看到,我用到了
MySQL
和
Redis
來(lái)存儲(chǔ)長(zhǎng)網(wǎng)址和短碼之間的映射關(guān)系。
用
MySQL
想必大家都能理解,但是為什么要用
Redis
呢,直接用數(shù)據(jù)庫(kù)不就好了嗎?
這個(gè)主要是考慮到生成短鏈接,在投放之后的訪問(wèn)量會(huì)比較大,使用
Redis
緩存后,能有效降低數(shù)據(jù)庫(kù)的壓力。
生成短碼的方法
通過(guò)上面的全流程設(shè)計(jì),會(huì)發(fā)現(xiàn)主要的問(wèn)題就是如何通過(guò)長(zhǎng)網(wǎng)址,去生成對(duì)應(yīng)的短碼。
短碼一般是由
[a - z, A - Z, 0 - 9]
這62 個(gè)字母或數(shù)字組成,短碼的長(zhǎng)度也可以自定義,但一般不超過(guò)8位。比較常用的都是6位,6位的短碼已經(jīng)能有568億種的組合:(26+26+10)^6 = 56800235584,已滿足絕大多數(shù)的使用場(chǎng)景。
目前比較流行的生成短碼方法有:
自增id
、
摘要算法
、
普通隨機(jī)數(shù)
。
該方法是一種無(wú)碰撞的方法,原理是,每新增一個(gè)短碼,就在上次添加的短碼id基礎(chǔ)上加1,然后將這個(gè)10進(jìn)制的id值,轉(zhuǎn)化成一個(gè)62進(jìn)制的字符串。
一般利用數(shù)據(jù)表中的自增id來(lái)完成:每次先查詢數(shù)據(jù)表中的自增id最大值max,那么需要插入的長(zhǎng)網(wǎng)址對(duì)應(yīng)自增id值就是 max+1,將max+1轉(zhuǎn)成62進(jìn)制即可得到短碼。
但是短碼 id 是從一位長(zhǎng)度開始遞增,短碼的長(zhǎng)度不固定,不過(guò)可以用 id 從指定的數(shù)字開始遞增的方式來(lái)處理,確保所有的短碼長(zhǎng)度都一致。同時(shí),生成的短碼是有序的,可能會(huì)有安全的問(wèn)題,可以將生成的短碼id,結(jié)合長(zhǎng)網(wǎng)址等其他關(guān)鍵字,進(jìn)行md5運(yùn)算生成最后的短碼。
10進(jìn)制轉(zhuǎn)成62進(jìn)制的具體實(shí)現(xiàn):
摘要算法又稱哈希算法,它表示輸入任意長(zhǎng)度的數(shù)據(jù),輸出固定長(zhǎng)度的數(shù)據(jù)。相同的輸入數(shù)據(jù)始終得到相同的輸出,不同的輸入數(shù)據(jù)盡量得到不同的輸出。
算法思路:
1、將長(zhǎng)網(wǎng)址通過(guò)
md5
運(yùn)算,生成 32 字符的 hex string,分為 4 段,每段 8 個(gè)字符;
2、對(duì)這四段循環(huán)處理,取 8 個(gè)字節(jié),將其看成 16 進(jìn)制串,并與 0x3fffffff(30位1) 與操作,即超過(guò) 30 位的忽略處理;
3、這 30 位分成 6 段,每 5 位的數(shù)字作為字母表的索引取得特定字符,依次進(jìn)行獲得 6 位字符串。
4、總的
md5
串可以獲得 4 個(gè) 6 位串,取里面的任意一個(gè)就可作為這個(gè)長(zhǎng)網(wǎng)址的短鏈接 url 地址。
雖然幾率很小,但是該方法依然存在碰撞的可能性,解決沖突會(huì)比較麻煩。不過(guò)該方法生成的短碼位數(shù),是固定的,也不存在連續(xù)生成的短碼有序的情況。
該方法是從62個(gè)字符串中隨機(jī)取出一個(gè)6位短碼的組合,然后去數(shù)據(jù)庫(kù)中查詢?cè)摱檀a是否已存在。如果已存在,就繼續(xù)循環(huán)該方法重新獲取短碼,否則就直接返回。
該方法是最簡(jiǎn)單的一種實(shí)現(xiàn),不過(guò)由于
Math.round()
方法生成的隨機(jī)數(shù)屬于偽隨機(jī)數(shù),碰撞的可能性也不小。在數(shù)據(jù)比較多的情況下,可能會(huì)循環(huán)很多次,才能生成一個(gè)不沖突的短碼。
具體實(shí)現(xiàn):
綜上,比較推薦使用第一種方法來(lái)實(shí)現(xiàn)短碼的生成。
如果覺得上面的技術(shù)太復(fù)雜,大家可以選擇「縮鏈」短鏈接的【自有域名綁定】功能,使用它的方法很簡(jiǎn)單:有手就行。
綁定自有域名之后,生成的短鏈接就可以實(shí)現(xiàn)在不改變域名的情況下將鏈接縮短,非常實(shí)用!