si1ent

短链学习与实践

2020-05-16

短链(Short URL)即为短网址,主要包含域名加部分字符(这类字符中包含指定的数字或a-z、A-Z、0-9随机生成的字符),因其较短而无需冗长的链接,同时也帮助我们解决了因字符长度限制而闻名.

原理

当浏览器中输入:http://yourls.me:4444/1时.

  • DNS首先解析获得的 http://yourls.me:4444 IP地址
  • 当 DNS获得IP地址以后(比如:192.168.3.12),会向这个地址发送 HTTP GET 请求,查询短码”1”.
  • http://yourls.me:4444 服务器会通过短码“1”获取对应的长 URL
  • 请求通过 HTTP 301 转到对应的长 URL http://www.si1ent.xyz/2019/03/05/hello-world/

短链作用

  • 缩短原链接长度,便于营销推广
  • 数据统计,在重定向的过程中进行PV、UV等数据统计
  • 屏蔽原链接域名

301&302

301 是永久重定向,302 是临时重定向.短地址一经生成就不会变化,所以用 301 是符合 HTTP 语义的.同时对服务器压力也会有一定减少. 但是如果使用了 301,我们就无法统计到短地址被点击的次数了.而这个点击次数是一个非常有意思的大数据分析数据源.能够分析出的东西非常非常多.所以选择302虽然会增加服务器压力.

算法实现

自增算法

不重复算法:
设置一个10进制的自增变量x,生成短链接时将其转换为62进制的数值,该数值便作为短链接,下次生成短链接则x+1.该算法运用了低进制转高进制,字符数会变少的原理.
十进制 2020,对应不同进制的字符表示:

进制在线转换工具

Hash算法

MD5消息摘要算法 (英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数用于确保信息传输完整一致.MD5 加密后的位数一般为两种,16 位与32 位,这里我们使用32位.

流程

  • 将长网址 md5 生成 32 位签名串,分为 4 段,每段 8 个字节.
  • 对这四段循环处理, 取 8 个字节,将他看成 16 进制串与 0x3fffffff(30位1) 与操作,即超过 30 位的忽略处理.
  • 这 30 位分成 6 段,每 5 位的数字作为字母表的索引取得特定字符,依次进行获得 6 位字符串.
  • 总的 md5 串可以获得4个6位串,取里面的任意一个就可作为这个长 url 的短URL地址.

YOURLS介绍

YOURLS (Your Own URL Shortener) 一款开源PHP程序,实现短网址生成系统.而无需第三方平台你就可以获得所有的数据统计,并且支持一系列插件扩展<可单独写>.
官网
Github项目

YOURLS特点

  • 安装简单
  • 私有或公共均可
  • 支持默认的数字顺序、指定关键字两种方式生成.
  • 轻松创建和分享链接
  • 历史点击报告、来源追踪、访客地理位置
  • 支持API

YOURLS搭建

环境准备

  • LAMP/LNMP环境WAMP等均可
  • YOURLS源码

源码下载

YOURLS

配置文档

YOURLS配置文档在user目录下的config-sample.php内,提前拷贝并修改文件为config.php.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
define( 'YOURLS_DB_USER', 'root' ); //数据库账户
define( 'YOURLS_DB_PASS', '123456' ); //数据库密码
define( 'YOURLS_DB_NAME', 'yourls' ); //YOURLS数据库名
define( 'YOURLS_DB_HOST', 'localhost' ); //数据库地址
define( 'YOURLS_DB_PREFIX', 'yourls_' ); //数据库前缀
define( 'YOURLS_SITE', 'http://yourls.me:4444' );//服务器域名,短地址也是基于这个生成,一定不能写错,不然会报错.
define( 'YOURLS_HOURS_OFFSET', '+8');    //时区偏移,默认即可.
define( 'YOURLS_LANG', 'zh_CN' );      //默认为英文,没有中文包,需要自己去 https://github.com/guox/yourls-zh_CN/下载,放到user/languages目录下
define( 'YOURLS_UNIQUE_URLS', true );   //短地址是否唯一
define( 'YOURLS_PRIVATE', true ); //是否私有,如果私有的,在进行api调用生成短地址时需要传递用户名和密码(默认即可)
define( 'YOURLS_COOKIEKEY', 'A2C7&H~r80pTps{nIfI8VFpTxnfF3c)j@J#{nDUh' );//加密cookie 去 http://yourls.org/cookie 获取
$yourls_user_passwords = array( 'admin' => '123456' /* Password encrypted by YOURLS */; //用户名=>密码 可填多个 登录成功后这里的明文密码会被加密 );
define( 'YOURLS_DEBUG', false );      //是否开启调试
define( 'YOURLS_URL_CONVERT', 62 );    //使用36进制 还是62进制 这个最好一开始设好不要修改,避免地址冲突,建议62进制
$yourls_reserved_URL = array( 'porn', 'faggot', 'sex', 'nigger', 'fuck', 'cunt', 'dick', //排除一下短地址,这些地址是不会生成的 );
  • 访问提醒数据库

注意:须提前新建数据库,不然会报错.

1
http://yourls.me:4444/admin/

先新建数据库
- **新建数据库**

  • Install

新建数据库后刷新网页即可显示如下图所示:

默认生成文件及表等信息.

  • 系统登录

可登录多个账户(配置文件中添加).

  • 新建短链

输入长链和关键字,关键字部分可省略,默认会是数字顺序添加.

  • 访问实战

API使用

yourls 提供了丰富的API,使用自身的API可以实现:

  1. 生成或获取短链
  2. 获取短链的统计信息
  3. 以 JSON, XML 或者纯文本输出
  4. 通过用户名密码或者安全的无密码token机制授权
    介绍配置文件时已经说明,如果想私有,就需要进行签名后才能使用API.

1
http://yourls.me:4444/yourls-api.php

参数

两种方式获得授权,一种是使用 username/password 对发送请求,但这种方式导致用户名密码在传输过程中被截取泄露;另一种方式是使用不需要密码的 token 机制,在 admin/tools.php 页面会产生当前用户的验证token;
动作 action 参数有很多个选项:

  • shorturl 获取链接的短链接
    在使用了值之后,另外两个参数
1
2
- `url` 用来缩短的原始链接
- `keyword` 或者 `title` 可选参数,用来自定义短链接
  • expand 获取短链接的原始长链接
    将短链接展开
1
- `shorturl` 值可以为 `abc` 或者完整的短链接
  • url-stats 获取短链接的信息
    短链接的统计信息
1
- `shorturl` 值可以为 `abc` 或者完整的短链接
  • stats 获取链接的信息
    获取链接的信息
1
2
- `filter` 值可以为 `top`, `bottom`, `rand`, `last`
- `limit` 返回的数量
  • db-stats 获取全局的链接和点击数

  • 输出格式 format 参数用来指定API输出的格式

1
2
3
4
jsonp
json
xml
simple

API生成短链

1
2
3
4
5
6
curl -X POST \
http://yourls.me:4444/yourls-api.php \
-F signature=3f5bd1d9a2 \
-F action=shorturl \
-F url=http://www.si1ent.xyz/2020/05/16/index.html \
-F format=json

参考

1
2
https://hufangyun.com/2017/short-url/
https://www.jianshu.com/p/d7c1edc0836e
Tags: YOURLS
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章