# 核心原理 長鏈接轉為短鏈接的核心原理是: 將短鏈接與原始長鏈接做一個映射,訪問短鏈接的時候,通過重定向的方式轉到長鏈接。 # 應用場景 比如分享功能,查看分享信息的原始鏈接通常是很長的,直接發給用戶,體驗不是很好,這時候就可以將其映射為一個短鏈接再發給用戶。 又比如我們熟知的百度網盤分享文件,雖 ...
核心原理
長鏈接轉為短鏈接的核心原理是: 將短鏈接與原始長鏈接做一個映射,訪問短鏈接的時候,通過重定向的方式轉到長鏈接。
應用場景
比如分享功能,查看分享信息的原始鏈接通常是很長的,直接發給用戶,體驗不是很好,這時候就可以將其映射為一個短鏈接再發給用戶。
又比如我們熟知的百度網盤分享文件,雖然細節有所差異,但核心原理都是如此。
長短鏈接映射表結構核心欄位設計
欄位名 | 欄位描述 |
---|---|
code | 短鏈接代碼 |
biz_type | 業務類型 |
biz_no | 業務編號 |
origin_link | 原始鏈接 |
除了這些核心欄位外,還可以根據業務需求設計一些輔助欄位。
核心欄位說明
code-短鏈接代碼: 用於與短鏈接功能變數名稱拼接成短鏈接的編號,比如code是“123456”,功能變數名稱是“share.baidu.com”,則完整的短鏈接為“https://share.baidu.com/123456”;
biz_type-業務類型: 原始鏈接的內容屬於哪個業務,比如分享的是一篇隨筆;
biz_no-業務編號: 原始鏈接的內容所屬業務的編號, 比如分享的隨筆的隨筆編號;
origin_link-原始鏈接: 訪問短鏈接,會重定向到此原始鏈接。
實現邏輯
總體步驟
- nginx配置短鏈接重定向到【Step 2】的介面
- 產品提供根據短鏈接代碼重定向原始鏈接的介面(根據短鏈接代碼查詢原始鏈接並重定向)
之所以有【Step 1】,是因為短鏈接代碼與原始鏈接的映射存在資料庫中,需要產品提供服務從資料庫中根據【code】查詢出【origin_link】之後做重定向,而程式提供的查詢介面通常包含了一些其它信息(比如介面功能變數名稱是“server.baidu.com”,而查詢介面的uri可能是“/api/share/v1/view/{code}”),仍然不夠短。
邏輯
以實際的例子來說明,下麵先列舉過程中所有需要使用到的素材:
- 短鏈接代碼(code):8lq4Sb
- 短鏈接功能變數名稱:share.hulujianyi.com
- 程式介面功能變數名稱:server.hulujianyi.com
- 程式介面URI以及參數:/hulu-common/api/share/v1/view/?shareCode=$code
- 原始鏈接(origin_link): https://patient-h5.hulujianyi.com/#/patientDetail?code=8lq4Sb&bizType=2&bizNo=3&t=1693298372310&shareSource=3&shareUserId=7&sign=f4Y9hK0Im23MbzMn%2Fx3st6FgGQO8FAXABSNEuptbXsXxBGj4CbUIpWeY2yGlwMwADBRs9tiYy2Zh
xVkPU7Gjw5CP0zyitnH1GQ48zetfM9XdjYB4MVkowgr1tG2WMCmavggi1Y1Z0KI1GPLASeXOaSQF
IYtOo2gHOhldr%2BGHnc4%3D&e=1694594372310
根據以上信息,則整體邏輯為: - 訪問內容的原始鏈接為【素材5】,而分享到用戶的是由【素材1】和【素材2】拼出來的短鏈接【https://share.hulujianyi.com/8lq4Sb】;
- nginx配置短鏈接轉發到由【素材3】和【素材4】拼出來的程式提供的介面【https://server.hulujianyi.com/hulu-common/api/share/v1/view/?shareCode=8lq4Sb】;
- 介面的功能是根據請求參數shareCode,也即是短鏈接代碼code,從資料庫中查詢出原始鏈接,然後做重定向;
- 所以整體流程為:訪問短鏈接 -> nginx重定向到介面 -> 介面重定向到原始鏈接
根據以上流程,下麵貼出一下關鍵性配置和代碼:
- nginx配置轉發
# 分享配置
server{
server_name share.hulujianyi.com;
access_log /usr/local/nginx/logs/access.log main;
listen 80;
listen 443 ssl;
include cert.conf; # 這裡是引入的ssl的證書配置
location ~ ^/(?<code>[^/]+)/?$ {
return 302 "https://server.hulujianyi.com/hulu-common/api/share/v1/view/?shareCode=$code";
}
}
配置中,正則表達式 ^/(?<code>[^/]+)/?$
捕獲 URL 中的URI,在演示例子中截取到的是8lq4Sb
,並將其存儲在名為 code
的變數中。然後在配置中使用 code
變數,例如在 rewrite 指令中進行重定向。
2. 介面根據code查詢原始鏈接和重定向的偽代碼
@GetMapping(value = "/view")
public void view(@RequestParam("shareCode") String shareCode, HttpServletResponse res) throws IOException {
try {
String link = iShareService.viewLink(shareCode);// 這裡是調用的根據code從資料庫查詢原始鏈接的方法
res.sendRedirect(link);
} catch (BizException e) {
LOGGER.warn(ExceptionUtil.exceptionStackTraceToString(e));
super.error(res, e);
} catch (Exception e) {
LOGGER.warn(ExceptionUtil.exceptionStackTraceToString(e));
super.error(res, null);
}
}
- 最終訪問的原始鏈接打開的內容,有一些業務校驗,則屬於另一套體系,這裡不做說明。
天道·酬勤 www.forest-sfg.com 學·無止境