基于nginx代理实现短链接跳转

基于nginx代理实现短链接跳转

最近项目需要,写了一个短链接微服务,基本原理如下图
在这里插入图片描述
那么我们的跳转实现步骤:

  1. 浏览器里输入 https://short.cn/abc123
  2. DNS首先解析获得 https://short.cn 的 IP 地址
  3. 当 DNS 获得 IP 地址以后(比如:127.0.0.1),会向这个地址发送 HTTP GET 请求,查询短码 abc123
  4. https://short.cn 服务器会通过短码 abc123 获取对应的长 URL
  5. 请求通过 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,然后处理进行跳转实现短链接跳转长链接的功能。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值