所以当我在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都需要被重写。 希望这可以帮助别人!