nodejs express:带有请求对象端口的主机名

nodejs express: hostname with port from the req object

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

我在我的部署设置中得到了完整的 URL。

'http://' + req.hostname + '/myapp'

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

http://localhost/myapp instead off http://localhost:3000/myapp

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

'http://' + req.hostname + ':' + port + '/myapp'

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

http://domain.com:3000/myapp

如果应用程序在代理外运行,是否有一种聪明的方法从请求对象中获取主机名和端口?

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

这个express source会有帮助:

  • req.hostname的值来源于 X-Forwarded-Host header,可以由客户端设置,也可以由 代理.

  • X-Forwarded-Proto可以设置反向代理告诉app 无论是 https 还是 http 甚至是无效名称。这个值是 反映在 req.protocol.

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

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

const proxyHost = req.headers["x-forwarded-host"];
const host = proxyHost ? proxyHost : req.headers.host;

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