Node短鏈原理與功能實現總結
導語:有時候我們經常在微博或者某些營銷簡訊中看見非常短小的網址,當你開啟它在遊覽器檢視時,發現跳轉到了一個非常長的網址,這其實就是用到了短網址的服務。今天,我就簡單的做一個總結,結合我之前開發的一個短鏈工具進行經驗知識總結。
目錄
- 原理說明
- 方法實現
- 實戰演練
原理說明
短網址,又叫短鏈,也就是一個非常短的網址,由域名加唯一id字母或數字字元混合組成,大概不超過10位數。
短網址建立
短網址建立方法如下:
- 獲取引數網址;
- 查詢是否存在,存在返回短網址,不存在建立短網址;
- 訪問短網址時候,查詢資料庫原網址作302;
短網址展示
短網址從開啟到展現網頁,中間經過以下步驟:
- 開啟短網址後請求短網址伺服器;
- 根據唯一id讀取資料庫原站網址;
- 進行302重定向到原站網址;
中間可能會統計訪問者資訊(IP,裝置資訊等),用來收集訪問資料,便於決策;
短網址作用
使用短網址的好處有以下幾個方面:
- 短網址比起一大段長長的網址來說,看起來很舒服;
- 短網址容易節省空間和資料庫容量;
- 短網址比較安全,避免黑客直接攻擊原站,減小DDOS,CC攻擊;
方法實現
建表
使用命令列連線mysql,然後建立一張short
表。
mysql -h 127.0.0.1 -P 3306 -u demo -p
mysql> use demo; Database changed mysql> show tables; +----------------+ | Tables_in_demo | +----------------+ | goods | | user | +----------------+ 3 rows in set (0.00 sec) mysql> CREATE TABLE `short` ( `id` int(11) NOT NULL COMMENT 'id', `sid` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '短鏈碼', `url` varchar(1046) NOT NULL COMMENT '網址', ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='短網址'; mysql> ALTER TABLE `short` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id'; mysql> ALTER TABLE `short` ADD PRIMARY KEY(`id`);
方法編寫
首先,先安裝一個npm包,然後使用包的str10To64
以及shortId
方法,生成短鏈識別碼
db
方法,前幾篇已經介紹過,不會的請返回前面文章檢視
npm install xquuid
- 建立短網址
const express = require('express'); const app = express(); const db = require('../model/simple'); const xqsql = require('xqsql'); const xquuid = require('xquuid'); app.post('/s', async (req, res) => { let baseUrl = 'http://127.0.0.1:3000/s/'; let userId = 10; let url = req.body.url; let urlReg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/; if (!url) { return res.json({ code: 101, msg: 'get_fail', data: { info: "網址不能為空!", } }) } if (!(urlReg.test(url))) { return res.json({ code: 101, msg: 'get_fail', data: { info: "網址格式錯誤!", } }) } let getSql = xqsql.get('short', { type: 'one', key: 'url', ids: [url], }, 'default', 'id,url,sid'); let getSqlResult = await db(getSql); if (getSqlResult.code == 200 && getSqlResult.data.list.length == 0) { let sid = xquuid.str10To64(xquuid.shortId(userId)); let shortUrl = `${baseUrl}${sid}`; let addParams = [ { sid, url } ] let addFields = [ { name: '短網址', value: 'sid', isMust: true }, { name: '原網址', value: 'url', isMust: true }, ] let addSql = xqsql.add('short', addParams, addFields); let addSqlResult = await db(addSql); if (addSqlResult.code == 200) { return res.json({ code: 200, msg: 'get_succ', data: { info: "建立成功!", url: shortUrl } }); } else { return res.json(addSqlResult); } } else { return res.json({ code: 101, msg: 'get_fail', data: { info: "網址已存在!", url: `${baseUrl}${getSqlResult.data.list[0].sid}` } }) } })
- 訪問短網址
// 訪問短鏈
app.get('/s/:sid', async (req, res) => {
let sid = req.params.sid;
if (!sid) {
return res.json({
code: 101,
msg: 'get_fail',
data: {
info: "短連結不能為空!",
}
})
}
let getSql = xqsql.get('short', {
type: 'one',
key: 'sid',
ids: [sid],
}, 'default', 'id,url');
let getSqlResult = await db(getSql);
if (getSqlResult.code == 200 &&
getSqlResult.data.list.length) {
let url = getSqlResult.data.list[0].url;
res.redirect(url);
} else {
return res.json({
code: 101,
msg: 'get_fail',
data: {
info: "短網址不存在!"
}
})
}
})
實戰演練
長網址尋找
這裡在網上找到兩個:
http://www.51yuansu.com/sc/vsvhhktgav.html
https://baijiahao.baidu.com/s?id=1704505053721054995&wfr=spider&for=pc
https://mp.weixin.qq.com/s?src=11×tamp=1625549401&ver=3173&signature=N5D9x59A5A1rhcpac3ujtOEu51niWlSwkna6186uwcvDZl2reuDxNFwv8fQOfOtLuV5XRQkJ6xSVAfWR5lpsSwDRpA3y6CIPLGT5xW21OL2BvJxsA*TvCwkEeX4v1SWr&new=1
postman建立
- 首先開啟postman,輸入一個長網址,傳送請求後得到如下內容:
訪問短網址
複製生成的短鏈進行訪問
基本上的演示就到這裡了,如果你覺得想要更短的網址,那你可以購買一個域名,解析到這個node伺服器上面來。
比如:url.me
,然後買一臺伺服器,解析一下,使用nginx
配置一下反向代理。
upstream shortSite {
server 127.0.0.1:3000 weight=1;
}
server {
listen 80;
server_name url.me;
location / {
proxy_pass http://shortSite/s/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
這樣再試著訪問一下上面的網址http://url.me/13mm
可以看到確實好看多了。
好了,短鏈的知識就介紹到這裡,如果有發現問題的,及時提問。