如何在将请求传递给nginx反向代理服务器之前更改请求参数

时间:2015-12-13 17:38:23

标签: nginx reverse-proxy nginx-location

我正在使用Nginx向一些后端服务器代理请求。 为此,我使用proxy_pass模块重定向。 配置文件: location = / hello { proxy_pass:abc.com }

我想执行以下工作流程。 请求nginx服务器 - >更改请求参数 - >将请求传递给abc.com - >更改响应参数 - >将回复发送回客户。

这可能与nginx有关吗?任何有关此问题的帮助/指示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您应该可以使用此

更改/设置新参数
location /hello {
  proxy_pass: abc.com 
  if ($args ~* paramToChange=(.+)) {
    set $args newParamName=$1;
  }
  set $args otherParam=value;
}

更新

开箱即用的nginx没有办法动态获取params请求,然后在发送客户端响应之前将它们应用到另一个请求。

您可以通过向名为lua的nginx添加模块来实现此目的。

可以通过下载并在安装期间将其添加到.configure选项中将此模块重新编译为nginx。另外,我喜欢随附的openresty软件包以及其他已有的有用模块,如echo。

拥有lua模块后,此服务器代码将起作用:

server {
    listen 8083;

    location /proxy/one {
        proxy_set_header testheader test1;
        proxy_pass http://localhost:8081;
    }

    location /proxy/two {
       proxy_pass http://localhost:8082;
    }

    location / {
        default_type text/html; 

        content_by_lua '
            local first = ngx.location.capture("/proxy/one",
               { args = { test = "test" } }
            )

            local testArg = first.body

            local second = ngx.location.capture("/proxy/two",
               { args = { test = testArg } }
            )

            ngx.print(second.body)
        ';

    }
}

我使用这样的几个节点js服务器测试了这个配置:

var koa = require('koa');
var http = require('http');

startServerOne();
startServerTwo();

function startServerOne() {
  var app = koa();


  app.use(function *(next){
    console.log('\n------ Server One ------');
    console.log('this.request.headers.testheader: ' + JSON.stringify(this.request.headers.testheader));
    console.log('this.request.query: ' + JSON.stringify(this.request.query));

    if (this.request.query.test == 'test') {
      this.body = 'First query worked!';
    }else{
      this.body = 'this.request.query: ' + JSON.stringify(this.request.query);
    }  
  });

  http.createServer(app.callback()).listen(8081);

  console.log('Server 1 - 8081');
}

function startServerTwo(){
  var app = koa();
  app.use(function *(next){

    console.log('\n------ Server Two ------');
    console.log('this.request.query: ' + JSON.stringify(this.request.query));

    if (this.request.query.test == 'First query worked!') {
      this.body = 'It Worked!';
    }else{
      this.body = 'this.request.query: ' + JSON.stringify(this.request.query);
    }
  });

  http.createServer(app.callback()).listen(8082);

  console.log('Server 2 - 8082');
}

这是节点控制台日志的输出:

Server 1 - 8081
Server 2 - 8082

------ Server One ------
this.request.headers.testheader: "test1"
this.request.query: {"test":"test"}

------ Server Two ------
this.request.query: {"test":"First query worked!"}

以下是发生的事情:

  1. Nginx向服务器1发送一个带有测试参数集的请求查询。

  2. 节点服务器1看到测试参数并以“First query working!”响应。

  3. Nginx使用正文从服务器一个响应更新查询参数。 Nginx向服务器2发送一个带有新查询参数的请求。

  4. 节点服务器2发现'test'查询参数等于'First query working!'并通过响应主体'It Worked!'响应请求。

  5. 卷曲响应或在浏览器中访问localhost:8083显示'It working':

    curl -i 'http://localhost:8083'
    HTTP/1.1 200 OK
    Server: openresty/1.9.3.2
    Date: Thu, 17 Dec 2015 16:57:45 GMT
    Content-Type: text/html
    Transfer-Encoding: chunked
    Connection: keep-alive
    
    It Worked!