所以我在指向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;
}
效果很好,除非我的快递应用程序调用重定向。
例如,开发框在端口8080上运行nginx,因此节点应用程序根目录的URL如下所示:
http://localhost:8080/app
当我从快递呼叫res.redirect('/app')
时,实际的重定向将转到:
http://localhost/app
由于没有任何东西在端口80上运行,显然,这会失败。我也找不到请求对象的任何属性,这些属性可以让我将URL构造为绝对URL。任何缺乏硬编码或使其成为环境变量的想法?
* 编辑:经过多一点挖掘,看起来主机头在这种情况下被定义为'localhost',而如果我直接连接到expres app,主机头是定义为'localhost:3000'(其中3000是节点应用正在侦听的端口)。那么如何更改上面的映射以包含nginx服务器的端口?
答案 0 :(得分:4)
我很确定这是因为这一行:
proxy_set_header Host $host;
我猜我会将Host
标题设置为localhost
。请参阅proxy_set_header上的文档。我认为这可以解决问题:
proxy_set_header Host $http_host;
它将传递客户端请求的Host
标头,该标头应为localhost:8080
。