nginx 代理传递重定向忽略端口

nginx 代理传递重定向忽略端口

因此,当我在 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 如下所示:

http://localhost:8080/应用程序

当我从节点调用重定向到“/app”时,实际的重定向转到:

http://localhost/应用程序

答案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 都需要重写。希望这对某些人有帮助!

相关内容