我正在使用Nginx向一些后端服务器代理请求。 为此,我使用proxy_pass模块重定向。 配置文件: location = / hello { proxy_pass:abc.com }
我想执行以下工作流程。 请求nginx服务器 - >更改请求参数 - >将请求传递给abc.com - >更改响应参数 - >将回复发送回客户。
这可能与nginx有关吗?任何有关此问题的帮助/指示都将不胜感激。
答案 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!"}
以下是发生的事情:
Nginx向服务器1发送一个带有测试参数集的请求查询。
节点服务器1看到测试参数并以“First query working!”响应。
Nginx使用正文从服务器一个响应更新查询参数。 Nginx向服务器2发送一个带有新查询参数的请求。
节点服务器2发现'test'查询参数等于'First query working!'并通过响应主体'It Worked!'响应请求。
卷曲响应或在浏览器中访问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!