Node.js nodejs-express:主机名和来自req对象的端口

Node.js nodejs-express:主机名和来自req对象的端口,node.js,express,proxy,hostname,Node.js,Express,Proxy,Hostname,有时,我想从我的节点应用程序在邮件中发送一个合格的URL。或者我想设置幻影页面对象的内容 我在部署设置中得到了完整的URL,如下所示 'http://' + req.hostname + '/myapp' 但是,在开发机器上,这通常会产生: 取而代之的是 我知道如何获取端口,但我不想使用以下内容: 'http://' + req.hostname + ':' + port + '/myapp' 这会在部署到代理后时产生类似的废话 如果应用程序在代理之外运行,是否有一种智能方法可以从请求对象

有时,我想从我的节点应用程序在邮件中发送一个合格的URL。或者我想设置幻影页面对象的内容

我在部署设置中得到了完整的URL,如下所示

'http://' + req.hostname + '/myapp'
但是,在开发机器上,这通常会产生:

取而代之的是

我知道如何获取端口,但我不想使用以下内容:

'http://' + req.hostname + ':' + port + '/myapp'
这会在部署到代理后时产生类似的废话


如果应用程序在代理之外运行,是否有一种智能方法可以从请求对象获取带有端口的主机名?

您要查找的是。如果您支持代理、负载平衡器等,这是获取原始url的最安全方法。请检查您的请求中是否存在该url,如果存在,请使用它,否则请使用您已经实现的url

这将有助于:

  • req.hostname的值是从 X-Forwarded-Host标头,可由客户端或 代理

  • 反向代理可以设置X-Forwarded-Proto来告知应用程序 无论是https还是http,甚至是无效名称。此值为 由req.protocol反映

  • req.ip和req.ips值由以下列表填充: 来自X-For的地址


我不知道为什么Express Request不推荐使用
主机
,但这是一段安全的代码,可以克服在代理后/不在代理后运行Express server的问题

const proxyHost=req.headers[“x-forwarded-host”];
常量主机=代理主机?proxyHost:req.headers.host;

(我发现最方便的方法是为涉及重定向的工作流构建“返回”URL,例如:OAuth 2)

是的。我正在这样做。如前所述。在部署中,一切都按其应有的方式工作。这个问题只存在于我的开发平台上。因此,目前我有localhost:3000硬编码,然后在推到版本控制之前切换注释。它正在工作,但并不优雅,因此问题是,是否有更聪明的方法可以让它在本地主机开发中工作,就像它在部署中工作一样。