Node短链原理与功能实现总结

导语:有时候我们经常在微博或者某些营销短信中看见非常短小的网址,当你打开它在游览器查看时,发现跳转到了一个非常长的网址,这其实就是用到了短网址的服务。今天,我就简单的做一个总结,结合我之前开发的一个短链工具进行经验知识总结。

# 目录

  • 原理说明
  • 方法实现
  • 实战演练

# 原理说明

短网址,又叫短链,也就是一个非常短的网址,由域名加唯一id字母或数字字符混合组成,大概不超过10位数。

# 短网址创建

短网址创建方法如下:

  • 获取参数网址;
  • 查询是否存在,存在返回短网址,不存在创建短网址;
  • 访问短网址时候,查询数据库原网址作302;

# 短网址展示

短网址从打开到展现网页,中间经过以下步骤:

  • 打开短网址后请求短网址服务器;
  • 根据唯一id读取数据库原站网址;
  • 进行302重定向到原站网址;

中间可能会统计访问者信息(IP,设备信息等),用来收集访问数据,便于决策;

# 短网址作用

使用短网址的好处有以下几个方面:

  • 短网址比起一大段长长的网址来说,看起来很舒服;
  • 短网址容易节省空间和数据库容量;
  • 短网址比较安全,避免黑客直接攻击原站,减小DDOS,CC攻击;

# 方法实现

# 建表

使用命令行连接mysql,然后建立一张short表。

mysql -h 127.0.0.1 -P 3306 -u demo -p
1
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`);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 方法编写

首先,先安装一个npm包,然后使用包的str10To64以及shortId方法,生成短链识别码

db方法,前几篇已经介绍过,不会的请返回前面文章查看

npm install xquuid
1
  • 创建短网址
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}`
            }
        })
    }

})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  • 访问短网址
// 访问短链
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: "短网址不存在!"
            }
        })
    }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 实战演练

# 长网址寻找

这里在网上找到两个:

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&timestamp=1625549401&ver=3173&signature=N5D9x59A5A1rhcpac3ujtOEu51niWlSwkna6186uwcvDZl2reuDxNFwv8fQOfOtLuV5XRQkJ6xSVAfWR5lpsSwDRpA3y6CIPLGT5xW21OL2BvJxsA*TvCwkEeX4v1SWr&new=1

# postman创建

  • 首先打开postman,输入一个长网址,发送请求后得到如下内容:

short short

# 访问短网址

复制生成的短链进行访问

short

基本上的演示就到这里了,如果你觉得想要更短的网址,那你可以购买一个域名,解析到这个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;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

这样再试着访问一下上面的网址http://url.me/13mm

可以看到确实好看多了。

short

好了,短链的知识就介绍到这里,如果有发现问题的,可以邮箱联系我。

分享至:

  • qq
  • qq空间
  • 微博
  • 豆瓣
  • 贴吧