nginx代理传递redirect忽略端口

所以当我在nginx conf中指向一个node.js应用程序时,我正在设置一个虚拟path。 相关部分如下所示:

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应用程序(一个快速应用程序)调用redirect时,效果很好。

作为一个例子,开发盒在端口8080上运行nginx,所以url到节点应用程序的根目录如下所示:

HTTP://本地主机:8080 /应用程序

当我从节点调用redirect到'/ app'时,实际的redirect转到:

HTTP://本地主机/应用

问题是Node.js应用程序没有正确地发出redirect。 您可以使用proxy_redirect在nginx中纠正这个问题:

 proxy_redirect http://localhost/ http://localhost:8080/; 

我只需要解决与运行在nginx后面的Jenkins相同的问题。 对我来说,是什么把服务器端口包含到发送给Jenkins的Host头中:

 proxy_set_header Host $host:$server_port; 

希望有所帮助。

我有这个问题,并使用$http_host而不是$host为我工作,因为它还包括端口号。

我尝试了上面的解决scheme,但是只要节点应用程序在位置标题中发布完全限定的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; 

在我们的例子中,节点服务器运行在8080上,而我们的nginx代理运行在8000上。这意味着位置标题中的每个完全合格的URL都需要被重写。 希望这可以帮助别人!