Nodejs Express:主机名和来自 req 对象的端口

Den*_*zus 12 proxy hostname node.js express

有时我想从我的节点应用程序通过邮件发送合格的 URL。或者我想设置幻像页面对象的内容。

我在部署设置中获得了这样的完整 URL。

'http://' + req.hostname + '/myapp'
Run Code Online (Sandbox Code Playgroud)

然而,在开发机器上,这通常会产生:

http://localhost/myapp而不是http://localhost:3000/myapp

我知道如何获取端口,但我不想使用类似的东西:

'http://' + req.hostname + ':' + port + '/myapp'
Run Code Online (Sandbox Code Playgroud)

在代理后面部署时会产生这样的废话。

http://domain.com:3000/myapp

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

kie*_*ans 14

我不确定为什么 Express Request 被弃用host,但这是一段安全的代码,可以克服在代理后面/不在代理后面运行 Express 服务器的问题。

const proxyHost = req.headers["x-forwarded-host"];
const host = proxyHost ? proxyHost : req.headers.host;
Run Code Online (Sandbox Code Playgroud)

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


sta*_*kas 3

您正在寻找的是X-Forwarded-For 标头。如果您使用代理、负载均衡器等,这是获取原始 url 的最安全方法。检查您的请求中是否存在此内容,如果存在则使用它,否则使用您已经实现的内容。

这个明确的来源将会有所帮助:

  • req.hostname 的值源自 X-Forwarded-Host 标头中设置的值,该值可以由客户端或代理设置。

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

  • req.ip 和 req.ips 值使用来自 X-Forwarded-For 的地址列表填充。

  • 是的。我正在做这个。如上所述。在部署中,一切都按其应有的方式进行。该问题仅存在于我的开发平台上。所以目前我对 localhost:3000 进行了硬编码,然后在推送到版本控制之前切换注释。它可以工作,但并不优雅,因此问题是是否有更智能的方法可以使其在本地主机开发中工作,就像在部署中工作一样。 (4认同)