nginx内部重定向(X-Accel-Redirect)在商务合作定制开发中应用

X-Accel-Redirect

    这篇博客来源于团队最近的项目方案。团队最近接了一些合作项目,合作项目免不了要加密/解密、加签/解签来保证基本的信息安全。以前,业务团队是有一套标准的算法供合作方接入,不过难免有些合作项目要按对方的标准来接入。

  • 方案一:业务团队都是针对合作方开发,定制接口;
  • 方案二:架一个适配层系统,将业务解放出来。

方案一对业务系统侵入大,而且开发、维护成本高,方案二比较好。但是适配层系统如何将请求转发到业务系统?nginx提供的内部重定向(X-Accel-Redirect)机制是一个比较好的方式。适配层系统在处理完特殊的解签后,在response里加一个header(X-Accel-Redirect)指定请求转发的路径(业务标准实现的路径),nginx收到响应报文不会返回给客户端,而是从指定的业务路径中请求内容返回客户端。

    用了X-Accel-Redirect机制以后,对外合作项目的请求到达业务系统已经是标准的结构了。请求路径如下:

   

    为什么用内部重定向而不直接用重定向,内部重定向有以下几点优势:

  • 用户感觉不到跳转;
  • 业务标准的路径不用暴露;
  • 少一次网络请求。

举例

   写两个接口(/focuse/hello、/focuse/hello2),其中/focuse/hello返回时设置"Accel-Redirect=/focuse/hello2"。我们请求/focuse/hello期望输出"redirect to hello2!",而不是"hello world!"

/**
 * @author :
 * @date :Created in 2020/5/15 下午11:56
 * @description:
 * @modified By:
 */
@RestController
@RequestMapping("/focuse")
public class WebSiteController {

    @RequestMapping("hello")
    public String hello(HttpServletResponse response) throws Exception{
        response.setHeader("X-Accel-Redirect", "/focuse/hello2?custom=" + URLEncoder.encode("redirect to hello2!", "UTF-8"));
        return "hello world!";
    }

    @RequestMapping(value = "hello2")
    public String hello2(@RequestParam("custom") String custom) {
        return custom;
    }
}

启动应用,端口是8080

配置nginx并启动,nginx监听的端口是80,nginx配置80请求代理到8080端口

 server {
        listen       80;
        location / {
            proxy_pass http://$host:8080;
        }
    }

请求:http://127.0.0.1/focuse/hello  输出redirect to hello2,并且浏览器地址栏还是focuse/hello(用户无感知)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值