nginx代理通过重定向重定向忽略端口


34

所以当我在我的nginx conf中指向一个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应用程序(快速应用程序)调用重定向时,效果很好。

例如,开发箱在端口8080上运行nginx,因此指向节点应用程序根目录的url如下所示:

http:// localhost:8080 / app

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

http:// localhost / app


建议使用以下答案:proxy_set_header主机$ http_host; 但是没有人说它可以导致漏洞(主机头攻击)。攻击示例这里还有更多的信息在这里

Answers:


14

问题在于Node.js应用程序未正确发出重定向。您可以proxy_redirect在nginx中使用它来纠正此问题:

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

47

我只需要在Nginx后面运行Jenkins来解决相同的问题。我要做的就是将服务器端口包含在Host要发送给Jenkins 的标头中:

proxy_set_header Host $host:$server_port;

希望能有所帮助。


3
答对了。如@mgorven所说,由于nginx严重转发了主机
Eric

5

我尝试了上述解决方案,但是每当节点应用程序在位置标头中发出完全限定的URL时,它们都将失败,例如“ http://nodeapp.com:8080/new/location

因此,我最终使用$ http_host传递主机和端口。并使用match〜^完全重写网址。

  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都需要重写。希望这可以帮助某人!


4

根据此问题的讨论,正确的解决方法是调整代理的Host标头指令。

更改此:

proxy_set_header Host $host;

对此:

proxy_set_header Host $http_host;

$http_host保留HTTP HOST标头中指定的值,该标头包括端口。重定向器应该选择自定义端口,而无需对OP的设置进行进一步的自定义。

这些答案(相同的票证)进一步阐述:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.