基于nginx代理实现短链接跳转
基于nginx代理实现短链接跳转最近项目需要,写了一个短链接微服务,基本原理如下图那么我们的跳转实现步骤:浏览器里输入 https://short.cn/abc123DNS首先解析获得 https://short.cn 的 IP 地址当 DNS 获得 IP 地址以后(比如:127.0.0.1),会向这个地址发送 HTTP GET 请求,查询短码 abc123https://short.cn 服务器
基于nginx代理实现短链接跳转
最近项目需要,写了一个短链接微服务,基本原理如下图
那么我们的跳转实现步骤:
- 浏览器里输入 https://short.cn/abc123
- DNS首先解析获得 https://short.cn 的 IP 地址
- 当 DNS 获得 IP 地址以后(比如:127.0.0.1),会向这个地址发送 HTTP GET 请求,查询短码 abc123
- https://short.cn 服务器会通过短码 abc123 获取对应的长 URL
- 请求通过 HTTP 301/302 转到对应的长 URL
https://www.abc.com/defgh/1234/5678
。
剖开来讲,依照上面的步骤,不依赖其他配置,那么我们的服务的端口和api接口地址也必须是127.0.0.1:80,还不能有其他的路径,这明显是不方便的。
如果我们的服务api地址是ip:8089/api/shortUrl/redirect,
说白了,就是如何让 ip:端口/keyword
类似127.0.0.1:80/abc123
代理到127.0.0.1:/8089/api/shorUrl/redirect
首先,keyword就是我们在数据库中原始长链对应的短码,服务端通过比对短码找出长链并重定向,可理解keyword就是参数,我们可以使用restful
风格的接口,这样参数就会放到url后面。
剩下就是处理127.0.0.1:80
代理到127.0.0.1:/8090/api/shortUrl/redirect
,我这里用了nginx的rewrite
,这里我的keyword是固定长度6位大小写字母和数字组成,所以我仅仅将符合这个正则的请求重写了地址,可以在nginx配置文件中监听80端口的location中增加
rewrite '^/[a-zA-Z0-9]{6}$' http://127.0.0.1:8089/api/shortUrl/redirect$document_uri break;
如:
server {
listen 80;
server_name localhost;
location / {
rewrite '^/[a-zA-Z0-9]{6}$' http://127.0.0.1:8089/api/shortUrl/redirect$document_uri break;
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
这里rewrite
的正则要加上单引,不然会报错。后面的$document_uri
是一个全局变量,存放了请求中的当前URI,并且不包括请求指令,比如http://www.myweb.name/server/source?arg1=value1&arg2=value2
中的/server/source
,这样就在url重写以后拼装上了keyword
,restful的api也就收到了参数。
这里有一篇关于Nginx rewrite及常用全局变量的介绍
这样就可以把我们127.0.0.1:80/abc123
的请求直接转到服务api,然后处理进行跳转实现短链接跳转长链接的功能。
更多推荐
所有评论(0)