一、短网址介绍
短网址(Short URL) ,顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。
短网址通常使用“比较少字符的网址”+“/”+“代码”,打开短网址网页通常会直接跳转到你要缩短的网址(常见),或者几秒广告后在跳转。比如向百度短网址可以自定义后缀,有些短网址还可以进行泛域名解析,十分方便大家使用。
YOURLS是一款使用PHP + Mysql开发的短链接程序,相比公共短网址好处是数据掌握在自己手中,可控性更高。
- 至少PHP 5.6 如果要使用api 还需要有curl拓展
- 至少MYSQL 5
二、搭建LNMP环境
这里直接yum装的mysql和php,如果要源码安装可以看之前装zabbix的博客php和mysql源码安装
1、安装mysql并创建数据库和密码
yum install mariadb-server #安装mysql
systemctl enable mariadb #开启启动
systemctl start mariadb #启动mysql
mysqladmin -u root password 123456 #设置root密码
mysql -u root -p #进入mysql查看
SHOW DATABASES;
create database yourls; #创建yourls数据库
quit;
2、安装php及其所需模块
因为centos7默认yum装的php版本是5.4的,而yourls最低要求5.6的,所以这里需要先设置yum源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum list | list php
新的yum源中php最新为7.1的,yum安装php及相关模块,然后启动
yum install php71w php71w-mysql php71w-fpm php71w-cli php71w-common php71w-curl -y
systemctl start php-fpm
systemctl enable php-fpm
3、安装nginx
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel prce pcre-devel
wget http://nginx.org/download/nginx-1.18.2.tar.gz
tar -zvxf nginx-1.18.2.tar.gz
cd nginx-1.18.2
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre
make && make install
三、yourls安装
git地址为https://github.com/YOURLS/YOURLS/releases,可以直接用git命令获取文件夹,或者下载压缩包后再解压,我这里直接用git获取了。
1、安装git然后进入nginx的html文件夹中,用git clone获取yourls,并将config-sample.php更名为config.php
yum install git -y
cd /usr/local/nginx/html/
git clone https://github.com/YOURLS/YOURLS
mv YOURLS/user/config-sample.php YOURLS/user/config.php
2、前面已经新建了一个MySQL数据库,并设置好账号密码了,这里修改user/config.php配置文件,填写正确的MySQL信息,配置信息如下。
vim YOURLS/user/config.php
#数据库用户名
define( 'YOURLS_DB_USER', 'root' );
#数据库密码
define( 'YOURLS_DB_PASS', '123456' );
#数据库名
define( 'YOURLS_DB_NAME', 'yourls' );
#数据库连接地址
define( 'YOURLS_DB_HOST', 'localhost' );
#数据库表前缀,一般保持默认
define( 'YOURLS_DB_PREFIX', 'yourls_' );
3、配置用户及密码
#修改配置文件
vi user/config.php
#设置用户名和密码,可设置多个用户 #web界面登录用户名和密码
$yourls_user_passwords = array(
'wangxiaoyu' => '123456',
// 'username2' => 'password2',
// You can have one or more 'login'=>'password' lines
);
4、其他设置
#设置站点域名,这里需要设置成你的域名,访问admin时会自动跳转到这个域名,我这里还没使用域名所以用的是ip地址
define( 'YOURLS_SITE', 'http://10.0.0.101' );
#GMT时间偏移
define( 'YOURLS_HOURS_OFFSET', '+8' );
#是否私有
define( 'YOURLS_PRIVATE', 'true' );
#设置cookie,可访问https://api.yourls.org/services/cookiekey/1.0/生成
define( 'YOURLS_COOKIEKEY', 'qQ4KhL_pu|s@Zm7n#%:b^{A[vhm' );
#mysql连接方式
define('YOURLS_DB_DRIVER','mysqli');
5、安装之前,请一定要确认你的yourls所在的目录里有一个.htaccess的文件,没有的话,安装会报错,会让你手动创建一个
[root@localhost html]# vim /usr/local/nginx/html/YOURLS/.htacess
# 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
6、nginx配置
server {
listen 80;
server_name 10.1.1.101;
root /usr/local/nginx/html/YOURLS/;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /yourls-loader.php;
}
location ~ ^/.+\.php {
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
}
}
/usr/local/nginx/sbin/nginx -s reload
7、yourls汉化
汉化包的git地址为https://github.com/guox/yourls-zh_CN,下载中文包然后解压后放在放在languages目录下
wget https://github.com/guox/yourls-zh_CN/archive/master.zip
unzip master.zip
或
git clone https://github.com/guox/yourls-zh_CN.git
8、访问10.0.0.101/admin,然后输入前面配置文件里设置的账号密码登陆
输入管理员账号密码登录后如果出现“Could not auto-encrypt passwords. Error was: “cannot write file”.”报错,请将user/config.php文件的权限改为666,然后刷新网页,再把权限改回644,因为你刚才填写密码时用的是明文,这样很危险,所以程序需要对其加密。
9、短地址默认是是按照顺序生成,从1开始,入下图
有可能我们想不按照这样顺序,可以推荐用时间戳来生成
只需要修改 includes/functions.php 272行左右,将 $id = yourls_get_next_decimal();注释,改为 $id = time();
vim /usr/local/nginx/html/YOURLS/includes/functions.php
然后再查看生成的短链接,已经不是按照顺序的了
四、yourls API
请求地址:http://域名//yourls-api.php
参数:username(用户名)、password(密码)、format(格式 json)、url(长地址)、action(功能,shorturl)
1、GET请求,构建下get请求,可以直接访问也可以用python构建请求
http://10.0.0.101/yourls-api.php?username=wangxiaoyu&password=123456&url=http://www.baidu.com&format=json&action=shorturl
python构建get请求
import requests, json
url = "http://10.0.0.101/yourls-api.php?"
data = {"username":"wangxiaoyu","password":"123456","url":"http://www.baidu.com","format":"json","action":"shorturl"}
response = requests.get(url, data)
print(json.loads(response.text))
访问返回的http://10.0.0.101/q94n1k这个短链接可以跳转到百度
返回信息为
{
'url': {
'keyword': 'q94o0a',
'url': 'http://www.baidu.com',
'title': '百度一下,你就知道',
'date': '2020-04-21 07:40:58',
'ip': '10.0.0.1'
},
'status': 'success',
'message': 'http://www.baidu.com 已保存为',
'title': '百度一下,你就知道',
'shorturl': 'http://10.0.0.101/q94o0a',
'statusCode': 200
}
如果不指定format为json的话,默认是XML格式
2、POST请求
用python来发送POST请求测试
这里以form表单形式提交数据,所以不需要将POST的data转为json格式
POST请求的几种编码方式可以参考:https://www.cnblogs.com/android-it/p/9558751.html
import requests, json
url = "http://10.0.0.101/yourls-api.php?"
data = {"username":"wangxiaoyu","password":"123456","url":"http://www.baidu.com","format":"json","action":"shorturl"}
response = requests.post(url, data)
print(json.loads(response.text))
返回的信息为
{
'url': {
'keyword': 'q94nkx',
'url': 'http://www.baidu.com',
'title': '百度一下,你就知道',
'date': '2020-04-21 07:31:45',
'ip': '10.0.0.1'
},
'status': 'success',
'message': 'http://www.baidu.com 已保存为',
'title': '百度一下,你就知道',
'shorturl': 'http://10.0.0.101/q94nkx',
'statusCode': 200
}
3、使用token而不使用账号密码
YOURLS允许使用username和password参数(如果您的设置是私有的话)以老式的方式调用API 。如果您担心将自己的凭证发送出去,还可以使用秘密签名令牌进行API调用。
signature在API请求中使用参数。例:
http://yoursite/yourls-api.php?signature=1002a612b4&action=...
python示例
import requests, json
url = "http://10.0.0.101/yourls-api.php?"
data = {"signature":"6962355501","url":"http://www.baidu.com","format":"json","action":"shorturl"}
response = requests.post(url, data)
print(json.loads(response.text))
如果提示504 url过长的话,则在nginx增加
client_max_body_size 5m;
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
如果遇到 Faithfully yours, nginx.错误,可能是cookies过长,可以看https://blog.csdn.net/wang_quan_li/article/details/41802643
http字段中添加
proxy_buffer_size 128k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 128k;
php配置中添加
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
如果还是不行就在location转发中也添加
proxy_buffer_size 128k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 128k;
参考
-
https://www.shileiye.com/615