我需要一个反向代理,能够将请求转发给具有相同体系结构但不相同的上游应用程序。 我无法控制在上游服务器上运行的代码。 这是一个与挤奶机器人接口的商业产品。 在过去的16个月中,我一直使用Nginx将请求上传到一个服务器,使用如下的位置块:
location /T4C { proxy_pass http://192.168.10.4/T4C/; proxy_read_timeout 90; }
它的工作正常,但不幸的是,Web应用程序是这样写的,每隔5秒将其redirect到“http:// ip /T4C/Content/StartPage.aspx”。这意味着我的位置名称必须始终为“/ T4C “如果我尝试/富,它会加载启动页面,但只要其中一个刷新触发,它会超时尝试访问/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
这导致了一个redirect循环,或500内部服务器错误的原因,我不明白(我认为500没有设置cookie时发生)
我也尝试过重写,现在我正在更多地考虑这个问题,但是我不太了解这个机制。
我也尝试阅读“起源”,但这些例子似乎是A / Btesting或负载平衡。 我想在这里清楚地表明,用户需要能够通过URL来select他们连接到的后端服务器,然后即使浏览器将不断尝试将其指向/ T4C / ***,该select仍然存在我知道理想的情况是改变webapp,但不幸的是,这超出了我的控制范围。 这些系统都编程相同,代码不是我的,我也不能改变它。
我希望我提出一个连贯的问题。 感谢您阅读这一点。
安德鲁。
我想我有它的工作。 感谢Anuboiz将我带入http_sub _module。 这确实是我需要的。 我相信我正在做的是拦截redirect并更改其URL。 我发现URL包含一个指示应用程序在哪里redirect到的参数。
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 '*'; }
你需要ngx_http_sub_module 。 它不包含在上游nginx(但可能仍然包含在你的Linux发行版中),所以你可能不得不从源代码构buildnginx。 它允许在响应主体中放置任意的string。
如果我正确理解,在你的情况下,你将需要像这样的东西:
location /T4C { proxy_pass http://127.0.0.1/T4C/; proxy_read_timeout 90; sub_filter '127.0.0.1' '192.168.10.4'; }