Nginx 反向代理到相同的 ajax 应用程序,选择带有 url 的应用程序

Nginx 反向代理到相同的 ajax 应用程序,选择带有 url 的应用程序

我需要一个反向代理,能够将请求转发到具有相同架构但不相同的上游应用程序。我无法控制上游服务器上运行的代码。它是一种与挤奶机器人交互的商业产品。在过去的 16 个月里,我一直使用 Nginx 将请求转发到上游的一台服务器,使用如下位置块:

location /T4C { proxy_pass http://192.168.10.4/T4C/; proxy_read_timeout 90; }

它工作正常,但不幸的是,Web 应用程序的编写方式是每 5 秒钟就会将您重定向到“http://知识产权/T4C/Content/StartPage.aspx” 这意味着我的位置名称必须始终是“/T4C” 如果我尝试 /foo 它将加载启动页面 但是一旦触发其中一个刷新 它就会在尝试访问 /T4C/Content/StartPage.aspx 时超时 我尝试使用 cookie:

location /crews {
  add_header Set-Cookie targetip=192.168.10.4/; #Tried with and without the slash

  proxy_pass    http://127.0.0.1/T4C; }

location /T4C {
  proxy_pass  http://$cookie_targetip/T4C/; }#Tried with and without the slashes, all permutaions

这会导致重定向循环,或者出现 500 内部服务器错误,原因我不太明白。(我认为 500 发生在没有设置 cookie 的时候)

我也尝试过重写,目前正在进一步研究这个问题,但我还是不太明白其原理。

我也尝试阅读有关“起源”的内容,但示例似乎要么是 A/B 测试,要么是负载平衡。我想在这里明确说明,用户需要能够通过 URL 选择要连接到哪个后端服务器,然后该选择必须持续,即使浏览器将继续尝试将其定向到 /T4C/*** 我知道理想的情况是更改 webapp,但不幸的是,这超出了我的控制范围。所有系统都是以相同的方式编程的,并且该代码不是我的,我也不能更改它。

我希望我提出的问题连贯。感谢您阅读到这里。

安德鲁。

答案1

我认为我已经成功了。感谢 Anuboiz 让我了解了 http_sub 模块。这确实是我需要的。我相信我正在做的是拦截重定向并更改其 URL。我发现 URL 包含一个参数,指示应用程序重定向到哪里。

location /CREWS/  {
proxy_pass http://192.168.10.4/T4C/;
proxy_read_timeout  90;
sub_filter_once off; #########This is important. Defaults to ON
sub_filter 'ReturnUrl=%2fT4C%2f' 'ReturnUrl=%2fCREWS%2f' ;
sub_filter '/T4C/' '/CREWS/' ;
sub_filter '/T4C/Content/Login.aspx?ReturnUrl=%2fT4C%2f' '/CREWS/Content/Login.aspx?ReturnUrl=%2fCREWS%2f';
sub_filter_types '*';

}

答案2

你需要ngx_http_sub_module。它不包含在上游 nginx 中(但可能仍包含在您的 Linux 发行版中),因此您可能必须从源代码构建 nginx。它允许响应主体中可以包含任意字符串。

如果我理解正确的话,你的情况将需要类似以下内容的东西:

location /T4C  {
    proxy_pass http://127.0.0.1/T4C/;
    proxy_read_timeout  90;
    sub_filter '127.0.0.1' '192.168.10.4';
}

相关内容