短鏈接和長鏈接
使用短鏈接的好處:短、字符少、美觀、便于發(fā)布、傳播
比如我的個人博客地址:http://will-johnson.gitee.io/blog/
使用百度短網(wǎng)址服務(wù)轉(zhuǎn)換為短網(wǎng)址為:https://dwz.cn/Eps6teX5
現(xiàn)象
當(dāng)在瀏覽器輸入短網(wǎng)址回車時,會有一個302跳轉(zhuǎn)。然后瀏覽器重新訪問location地址

對于302多余的解釋
302 Found,Moved Temporarily,可以簡單的理解為該資源原本確實存在,但已經(jīng)被臨時改變了位置;換而言之,就是請求的資源暫時駐留在不同的URI下
對于服務(wù)器,通常會給瀏覽器發(fā)送HTTP Location頭部來重定向到新的新位置,然后瀏覽器重新加載該Location
HTTP Location 是在兩種情況下,因來自HTTP服務(wù)器的響應(yīng)中返回頭域:1.要求網(wǎng)頁瀏覽器加載其他網(wǎng)頁(域名轉(zhuǎn)址)
但是
跳轉(zhuǎn)用301還是302?301是永久重定向,302是臨時重定向。短地址一經(jīng)生成就不會變化,所以用301是符合http語義的。同時對服務(wù)器壓力也會有一定減少。 但是如果使用了301,我們就無法統(tǒng)計到短地址被點(diǎn)擊的次數(shù)了。而這個點(diǎn)擊次數(shù)是一個非常有意思的大數(shù)據(jù)分析數(shù)據(jù)源。能夠分析出的東西非常非常多。所以選擇302雖然會增加服務(wù)器壓力,但是我想是一個更好的選擇。
- 301
表示被請求的資源已永久移動(Moved Permanently),永久移動到新位置,任何對此資源的引用都應(yīng)該使用本響應(yīng)返回的若干個URI之一。如果可能,擁有鏈接編輯功能的客戶端應(yīng)當(dāng)自動把請求的地址修改為從服務(wù)器反饋回來的地址。正常這個響應(yīng)是可緩存的,除非額外指定。新的永久性的URI應(yīng)當(dāng)在響應(yīng)的Location域中返回,正常實體中應(yīng)當(dāng)包含指向新的URL的超鏈接及簡短說明,除非是HEAD類的請求。
- 302
如果返回狀態(tài)碼302,表示要求客戶端臨時重寶向(Moved Temporarily)。由于是臨時重定向,客戶端應(yīng)當(dāng)繼續(xù)向原有地址發(fā)送以后的請求,并且只有在Cache-Control或Expires中指定的情況下,響應(yīng)才可以緩存。注意:雖然RFC 1945和RFC 2068規(guī)范不允許客戶端在重定向時改變請求的方法,但是很多現(xiàn)存的瀏覽器將302響應(yīng)視作為303響應(yīng),并且使用GET方式訪問在Location中規(guī)定的URI,而無視原先請求的方法。因此狀態(tài)碼303和307被添加了進(jìn)來,用以明確服務(wù)器期待客戶端進(jìn)行何種反應(yīng)。
原理
短鏈接的原理其實就是:
將長鏈接通過一定的
手段生成一個短鏈接訪問短鏈接時實際訪問的是短鏈接服務(wù)器,然后根據(jù)短鏈接的參數(shù)找回對應(yīng)的長鏈接
重定向跳轉(zhuǎn)
業(yè)內(nèi)實現(xiàn)
發(fā)號器(ID自增)+62進(jìn)制編碼
如對于我的博客地址:http://will-johnson.gitee.io/blog/,發(fā)號16進(jìn)制:816e351d15bf,轉(zhuǎn)換為62進(jìn)制即為:Eps6teX5
為什么要用62進(jìn)制轉(zhuǎn)換
62進(jìn)制轉(zhuǎn)換是因為62進(jìn)制轉(zhuǎn)換后只含數(shù)字+小寫+大寫字母。而64進(jìn)制轉(zhuǎn)換會含有
/,+這樣的符號(不符合正常URL的字符)10進(jìn)制轉(zhuǎn)62進(jìn)制可以縮短字符,如果我們要6位字符的話,已經(jīng)有560億個組合了。
但是如何實現(xiàn)一個長地址多次轉(zhuǎn)換都是同一個短地址呢?
這個不能完全做到。如果想要完全做到,那么就需要保存長地址到短地址的映射關(guān)系,得不償失。
可以采取一個折中的方案,采用有有效時間的kv存儲,也就是一個緩存系統(tǒng)。
其他方法
-
實現(xiàn)一個算法,把長地址轉(zhuǎn)成短地址,但是不存在逆運(yùn)算。我們需要把短對長的關(guān)系存到DB中,在通過短查長時,需要查DB
- 不可以,會出現(xiàn)碰撞