【发布时间】:2019-02-04 06:17:05
【问题描述】:
我的 nginx 配置文件中目前有以下代理传递定义:
location /pass/ {
proxy_pass http://localhost:9999/pass/;
proxy_redirect off;
proxy_set_header Host $host;
}
这是按预期工作的 - /pass 请求被转发到在端口 9999 上运行的应用程序。
现在,我想做的是使端口转发部分动态如下:
location /pass/<input> {
{a $port variable here that is evaluated via a script (php?)}
proxy_pass http://localhost:$port/pass/;
proxy_redirect off;
proxy_set_header Host $host;
}
对 /pass/ABCD1234 的请求应转发到端口 9898,对 /pass/ABCD5678 的请求应转发到端口 9797。
请注意,流程是动态的 - 因此,从 ABCD1234 到 9898 的映射应该通过某种脚本(可能是 PHP?)发生,并且根据脚本的输出(端口)proxy_pass 应该将请求转发给那个港口。
请在这方面提供帮助。
更新:
我不想从 URI 输入中获取 proxy_pass 端口,而是希望通过 cookie 来实现这一点。所以,这里是更新的代码块:
location /pass/ {
add_header X-debug-message $host always;
add_header X-debug-message $cookie_sdmport;
set $proxyurl http://127.0.0.1:$cookie_theport/pass/;
add_header X-debug-message $proxyurl;
proxy_pass $proxyurl;
proxy_redirect off;
proxy_set_header Host $host;
}
使用此代码,将循环 301 重定向回浏览器。我切换回静态端口的那一刻,它又可以工作了!奇怪的! X-debug-message 中的 $proxyurl 在浏览器上看起来是正确的。所以,想知道为什么 proxy_pass 会做 301!
更新 2:
终于可以使用以下设置进行转发:
set $targetIP 127.0.0.1;
set $targetPort $cookie_passport;
proxy_pass http://$targetIP:$targetPort$request_uri;
不确定为什么上面发布的解决方案一直以 301 旋转 - 我猜 nginx 不喜欢在 proxy_pass 参数中混合动态和静态部分
谢谢。
【问题讨论】: