• 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&timestamp=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

    可以看到确实好看多了。

    在这里插入图片描述

    好了,短链的知识就介绍到这里,如果有发现问题的,及时提问。

  • 相关阅读:
    Yii together
    linux 文件处理大杂烩
    Ubuntu 17.10 环境初始化
    关掉 ubuntu bug 报告功能
    git svn 流程
    [Mac] How do I move a window whose title bar is off-screen?
    可爱的Python_课后习题_CDay−5 Python 初体验和原始需求
    python_编程规范
    python_excel
    python_os
  • 原文地址:https://www.cnblogs.com/guanqiweb/p/14983289.html
Copyright © 2020-2023  润新知