共计 3610 个字符,预计需要花费 10 分钟才能阅读完成。
导语:有时候咱们常常在微博或者某些营销短信中看见十分短小的网址,当你关上它在游览器查看时,发现跳转到了一个十分长的网址,这其实就是用到了短网址的服务。明天,我就简略的做一个总结,联合我之前开发的一个短链工具进行教训常识总结。
目录
- 原理阐明
- 办法实现
- 实战演练
原理阐明
短网址,又叫短链,也就是一个十分短的网址,由域名加惟一 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
能够看到的确难看多了。
好了,短链的常识就介绍到这里,如果有发现问题的,及时发问。