前言

你是否遇到过这样的场景?你有一个链接,例如https://detail.tmall.com/item.htm?spm=a230r.1.14.1.16b64046kb50gr&id=563033197139&ns=1&abbucket=5,需要分享给朋友,这个链接长而且不好记忆,需要经常用到的时候也不方便,假设你需要发微博,由于字数限制,链接长度越短越好,这时候如果有一个链接https://short.cn/tmall经过重定向可以指向前文的网址,那边就会很美观且方便,而这就需要用到短链接生成技术。

其实短链接的作用主要在于数据统计、控制访问、便于管理。另外相同的页面,短链接与原链接生成的二维码的复杂度也大大不同。目前市面上主要的短链接服务可以参考:短网址服务,我们该怎么选?,其中安照优先级介绍了部分优质的服务提供商。

除了使用服务商提供的短链接生成服务外,我们其实还可以自己搭建一个这样的服务。原理很简单,通过某种算法将长链接A转化为一个短字符串B,浏览器结合域名C访问C/B,服务器响应跳转至A,并在过程中完成数据的统计。目前有很多开源的短链接服务,其中之一就是今天的主角Yourls

Yourls

YOURLS stands for Your Own URL Shortener. It is a small set of PHP scripts that will allow you to run your own URL shortening service (a la TinyURL or Bitly).
Running your own URL shortener is fun, geeky and useful: you own your data and do not depend on third-party services. It is also a great way to add branding to your short URLs, instead of using the same public URL shortener everyone uses.

Yourls的特性是开源免费,可以管理、统计每一个短链接的数量,提供API接口,而且具有众多插件,便于进行二次开发,下面就一起搭建一个自己的软链接服务。

准备

Yourls是基于PHP和MySQL开发的,所以需要提前准备好:

  • Apache(2.4版本及以上)或Nginx服务器
  • PHP(7.4版本及以上)
  • MySQL(5.0版本及以上)

另外如果需要使用API接口,还需要安装PHP cURL拓展。

安装

下载

Releases下载最新版本的安装包,目前使用的是1.8.1版本,并解压至工作目录

配置文件

user目录下的config-sample.php复制备份命名为config.php,修改配置如下,更多设置请参考Config

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
// 数据库配置
define( 'YOURLS_DB_USER', 'yourls' ); //用户名
define( 'YOURLS_DB_PASS', 'xxxxxxxx' ); //密码
define( 'YOURLS_DB_NAME', 'yourls' ); //数据库名
define( 'YOURLS_DB_HOST', 'localhost' ); //地址
define( 'YOURLS_DB_PREFIX', 'yourls_' ); //表前缀

// 站点设置
#设置站点
define( 'YOURLS_SITE', 'http://ozh.in' ); //域名
define( 'YOURLS_LANG', '' ); //语言
define( 'YOURLS_UNIQUE_URLS', true ); //是否允许长链接对应多个短链接
define( 'YOURLS_HOURS_OFFSET', '-5' ); //时区偏移
define( 'YOURLS_PRIVATE', 'true' ); //是否私有,如果私有的,则api接口需要传递用户名和密码,如果公开,则可以自由访问后台
define( 'YOURLS_COOKIEKEY', 'modify this text with something random' ); //设置cookie,可访问http://yourls.org/cookie生成

// 用户设置
$yourls_user_passwords = array(
'username' => 'password', //用户名=>密码,可填多个,登录成功后这里的明文密码会被加密
);
define( 'YOURLS_DEBUG', false ); //是否开启调试
define( 'YOURLS_URL_CONVERT', 62 ); //短链接字符串使用36进制或2进制,建议62进制
$yourls_reserved_URL = array(
'porn', 'faggot', 'sex', 'nigger', 'fuck', 'cunt', 'dick', //黑名单
);

服务器设置

  1. Apache
    需要开启mod_rewrite模块,编辑.htaccess文件:
configuration
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 根目录http://yoursite/
# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /yourls-loader.php [L]
</IfModule>
# END YOURLS

# 二级目录http://yoursite/somedir/
# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /somedir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /somedir/yourls-loader.php [L]
</IfModule>
# END YOURLS
  1. Nginx
    请注意宝塔用户安照文档中的操作可能无效,可以更改为:
configuration
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
server {

# HTTP over IPv4 & IPv6
listen 80;
listen [::]:80;

# HTTPS over IPv4 & IPv6
# MUST BE EDITED TO REFLECT YOUR CONFIGURATION
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate example.com.crt;
ssl_certificate_key example.com.key;

# Server names
# MUST BE EDITED TO REFLECT YOUR CONFIGURATION
server_name example.com www.example.com;

# Root directory
# MUST BE EDITED TO REFLECT YOUR CONFIGURATION
root /path/to/yourls/files;

# 更改部分在这里!!!
# 更改部分在这里!!!
# 更改部分在这里!!!
location /
{
if (!-f $request_filename){
set $rule_0 1$rule_0;
}
if (!-d $request_filename){
set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
rewrite ^/.*$ /yourls-loader.php last;
}
}

# PHP engine
location ~ \.php$ {
include fastcgi.conf;
# OR
# include fastcgi_params;

fastcgi_index index.php;

# MUST BE EDITED TO REFLECT YOUR CONFIGURATION
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
}

安装

访问http://domain.com/admin完成初安装,输入配置文件设置的账号、密码登陆后台。如果安装出错,可能是PHP或者MySQL版本不符合要求,或者是数据库初始化失败,可以按照参考资料3进行解决。

短域名

短链接最重要的还是根域名要短,但是以.com.cn.org.top.xyz等常见一级域名的短域名基本已经抢注完成,剩下的价格也很昂贵。为了减小这个问题带来的影响,有两种解决方案。

付费域名

在我国的.cn域名下有一类特殊的二级域名:按照国家各个省级行政区划分的行政区划域名,例如bj.cn代表北京,sh.cn代表上海等。这些域名注册比较少,一些比较短的域名(例如fox.hn.cn,湖南)很有可能没有被注册,而且价格很便宜。目前西部数码域趣网络等都提供这一类域名的注册。

免费域名

由于特殊原因,Freenom目前已经停止注册新的免费域名。

Freenom是国际著名的免费域名提供商,可以提供.tk(托克劳)、.ml(马里)、.ga(加蓬)、.cf(中非共和国)、.gq(赤道几内亚)等国家一级域名,除特殊域名(少于4个字母,特殊含义等)外均可免费获取。

在Freenom获取免费域名有几个需要注意的地方:
1. 需要科学上网
2. 注册账号时,填写的地址信息一定要与科学上网后的IP地址保持一致,最好在美国!最好在美国!最好在美国!
3. 点击上图的现在获取会显示不可用,此时你只需要在搜索框中输入ffox.ga就可以解决,自动帮你添加购物车

拓展与配置

Yourls具有丰富的插件和主题,还有各种语言的翻译包,所有的插件都能在awesome-yourls找到介绍与项目地址。下面介绍一些我使用的拓展。

插件

  1. Allow Hyphens in Short URLs

自带的插件,允许短链接中出现连字符。

  1. Random ShortURLs

默认情况下,短链接按照顺序生成,从1开始,但是更好的方式是使用时间戳或随机字符串,这一个插件就可以随机生成短链接字符串,还可以设置字符串的长度。

  1. Cache stat pages

后台查看统计报表的数据都是实时统计的,此插件可以将缓存统计报表,加快访问速度。

  1. YOURLS Static Titles

当你输入一个长链接生成短链时,YOURLS会抓取长链接对应页面的标题信息,所以创建短链接的速度会受到页面访问速度的影响,此插件可以经过设置跳过抓取标题,加快生成速度。除了这一种方案以外,还可以根据参考资料4进行配置。

翻译

下载汉化包中的zh_CN.mo文件,移动至/user/languages文件夹下,设置配置文件中的语言为zh_CN即可。

主题

目前官方页面的主题只有3个,大家可以搜寻比较好看的。我使用的主题是Sleeky,不仅很好看而且还会添加前端首页。

  1. 下载文件
  2. 移动sleeky-frontend文件夹到网站根目录下
  3. 配置frontend/config.php
  4. 移动sleeky-backend文件夹至user/plugins/目录
  5. 在后台管理中example.com/admin/plugins.php启用插件

其他

查看统计数据,可以在后台的管理界面中数据统计查看,也可以在短链接后面添加+查看,例如https://short.cn/tmall+,包括访问量、地区和来源等。

参考资料

  1. YOURLS: Your Own URL Shortener
  2. YOURLS Wiki
  3. 用yourls 搭建短链接地址服务
  4. 关于yourls生成短链耗时太长问题解决
  5. HEXO博客引用B站视频并自动适配