核心原理
長(zhǎng)鏈接轉(zhuǎn)為短鏈接的核心原理是: 將短鏈接與原始長(zhǎng)鏈接做一個(gè)映射,訪問(wèn)短鏈接的時(shí)候,通過(guò)重定向的方式轉(zhuǎn)到長(zhǎng)鏈接。
應(yīng)用場(chǎng)景
比如分享功能,查看分享信息的原始鏈接通常是很長(zhǎng)的,直接發(fā)給用戶,體驗(yàn)不是很好,這時(shí)候就可以將其映射為一個(gè)短鏈接再發(fā)給用戶。
又比如我們熟知的百度網(wǎng)盤分享文件,雖然細(xì)節(jié)有所差異,但核心原理都是如此。
長(zhǎng)短鏈接映射表結(jié)構(gòu)核心字段設(shè)計(jì)
字段名 | 字段描述 |
---|---|
code | 短鏈接代碼 |
biz_type | 業(yè)務(wù)類型 |
biz_no | 業(yè)務(wù)編號(hào) |
origin_link | 原始鏈接 |
除了這些核心字段外,還可以根據(jù)業(yè)務(wù)需求設(shè)計(jì)一些輔助字段。
核心字段說(shuō)明
code-短鏈接代碼: 用于與短鏈接域名拼接成短鏈接的編號(hào),比如code是“123456”,域名是“share.baidu.com”,則完整的短鏈接為“https://share.baidu.com/123456”;
biz_type-業(yè)務(wù)類型: 原始鏈接的內(nèi)容屬于哪個(gè)業(yè)務(wù),比如分享的是一篇隨筆;
biz_no-業(yè)務(wù)編號(hào): 原始鏈接的內(nèi)容所屬業(yè)務(wù)的編號(hào), 比如分享的隨筆的隨筆編號(hào);
origin_link-原始鏈接: 訪問(wèn)短鏈接,會(huì)重定向到此原始鏈接。
實(shí)現(xiàn)邏輯
總體步驟
- nginx配置短鏈接重定向到【Step 2】的接口
- 產(chǎn)品提供根據(jù)短鏈接代碼重定向原始鏈接的接口(根據(jù)短鏈接代碼查詢?cè)兼溄硬⒅囟ㄏ颍?br> 之所以有【Step 1】,是因?yàn)槎替溄哟a與原始鏈接的映射存在數(shù)據(jù)庫(kù)中,需要產(chǎn)品提供服務(wù)從數(shù)據(jù)庫(kù)中根據(jù)【code】查詢出【origin_link】之后做重定向,而程序提供的查詢接口通常包含了一些其它信息(比如接口域名是“server.baidu.com”,而查詢接口的uri可能是“/api/share/v1/view/{code}”),仍然不夠短。
邏輯
以實(shí)際的例子來(lái)說(shuō)明,下面先列舉過(guò)程中所有需要使用到的素材:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-679718.html
- 短鏈接代碼(code):8lq4Sb
- 短鏈接域名:share.hulujianyi.com
- 程序接口域名:server.hulujianyi.com
- 程序接口URI以及參數(shù):/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
根據(jù)以上信息,則整體邏輯為: - 訪問(wèn)內(nèi)容的原始鏈接為【素材5】,而分享到用戶的是由【素材1】和【素材2】拼出來(lái)的短鏈接【https://share.hulujianyi.com/8lq4Sb】;
- nginx配置短鏈接轉(zhuǎn)發(fā)到由【素材3】和【素材4】拼出來(lái)的程序提供的接口【https://server.hulujianyi.com/hulu-common/api/share/v1/view/?shareCode=8lq4Sb】;
- 接口的功能是根據(jù)請(qǐng)求參數(shù)shareCode,也即是短鏈接代碼code,從數(shù)據(jù)庫(kù)中查詢出原始鏈接,然后做重定向;
- 所以整體流程為:訪問(wèn)短鏈接 -> nginx重定向到接口 -> 接口重定向到原始鏈接
根據(jù)以上流程,下面貼出一下關(guān)鍵性配置和代碼:
- nginx配置轉(zhuǎn)發(fā)
# 分享配置
server{
server_name share.hulujianyi.com;
access_log /usr/local/nginx/logs/access.log main;
listen 80;
listen 443 ssl;
include cert.conf; # 這里是引入的ssl的證書(shū)配置
location ~ ^/(?<code>[^/]+)/?$ {
return 302 "https://server.hulujianyi.com/hulu-common/api/share/v1/view/?shareCode=$code";
}
}
配置中,正則表達(dá)式 ^/(?<code>[^/]+)/?$
捕獲 URL 中的URI,在演示例子中截取到的是8lq4Sb
,并將其存儲(chǔ)在名為 code
的變量中。然后在配置中使用 code
變量,例如在 rewrite 指令中進(jìn)行重定向。
2. 接口根據(jù)code查詢?cè)兼溄雍椭囟ㄏ虻膫未a文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-679718.html
@GetMapping(value = "/view")
public void view(@RequestParam("shareCode") String shareCode, HttpServletResponse res) throws IOException {
try {
String link = iShareService.viewLink(shareCode);// 這里是調(diào)用的根據(jù)code從數(shù)據(jù)庫(kù)查詢?cè)兼溄拥姆椒? 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);
}
}
- 最終訪問(wèn)的原始鏈接打開(kāi)的內(nèi)容,有一些業(yè)務(wù)校驗(yàn),則屬于另一套體系,這里不做說(shuō)明。
到了這里,關(guān)于鏈接縮短 短鏈接 長(zhǎng)鏈接轉(zhuǎn)為短鏈接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!