Вы должны иметь возможность изменять/устанавливать новые параметры с помощью этого
location /hello {
proxy_pass: abc.com
if ($args ~* paramToChange=(.+)) {
set $args newParamName=$1;
}
set $args otherParam=value;
}
Обновлять:
В nginx нет готового способа сделать запрос на динамическое получение параметров, а затем применить их к другому запросу перед отправкой ответа клиента.
Вы можете сделать это, добавив в nginx модуль с именем lua.
Этот модуль можно перекомпилировать в nginx, скачав его и добавив в параметры .configure во время установки. Также мне нравится поставляемый с ним пакет 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-серверов node, например:
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 видит тестовый параметр и отвечает «Первый запрос сработал!».
Nginx обновляет параметры запроса телом от сервера одним ответом. Nginx отправляет серверу два запрос с новыми параметрами запроса.
Сервер узла 2 видит, что параметр запроса «тест» равен «Первый запрос сработал!» и отвечает на запрос телом ответа «Это сработало!».
И ответ curl или посещение localhost: 8083 в браузере показывает «Это сработало»:
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!
person
curtwphillips
schedule
13.12.2015