因此,当我在 nginx 配置中指向 node.js 应用程序时,我设置了一个虚拟路径。相关部分如下所示:
location /app {
rewrite /app/(.*) /$1 break;
proxy_pass http://localhost:3000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
效果很好,除了当我的 node.js 应用程序(一个快速应用程序)调用重定向时。
举个例子,dev box 在端口 8080 上运行 nginx,因此节点应用程序根目录的 url 如下所示:
当我从节点调用重定向到“/app”时,实际的重定向转到:
答案1
问题在于 Node.js 应用程序没有正确发出重定向。您可以使用proxy_redirect
在 nginx 中纠正这个问题:
proxy_redirect http://localhost/ http://localhost:8080/;
答案2
我只需要解决 Jenkins 在 nginx 后面运行的相同问题。我所做的就是将服务器端口包含在Host
发送给 Jenkins 的标头中:
proxy_set_header Host $host:$server_port;
希望有所帮助。
答案3
根据对话这个问题,正确的解决方法是调整代理的Host
标头指令。
改变这个:
proxy_set_header Host $host;
对此:
proxy_set_header Host $http_host;
$http_host
保存 HTTP HOST 标头中指定的值,其中包括端口。重定向应选择自定义端口,而无需进一步自定义 OP 的设置。
这些答案(同一张票)进一步阐述:
答案4
我尝试了上述解决方案,但只要节点应用程序在位置标头中发出完全限定的 URL,它们都会失败,例如“http://nodeapp.com:8080/new/location“
所以我最终使用 $http_host 来传递主机和端口。并使用匹配 ~^ 来完全重写 URL。
proxy_pass http://10.0.0.3:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect default;
proxy_redirect ~^(https?://[^:]+):\d+(?<relpath>/.+)$ http://10.0.0.3:8000$relpath;
在我们的例子中,Node 服务器在 8080 上运行,而我们的 nginx 代理在 8000 上运行。这意味着位置标头中的每个完全限定 URL 都需要重写。希望这对某些人有帮助!