nodejs express:主机名以及来自 req 对象的端口

问题描述 投票:0回答:3

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

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

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

但是在开发机器上这通常会产生:

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

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

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

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

http://domain.com:3000/myapp

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

node.js express proxy hostname
3个回答
12
投票

我不确定为什么 Express Request 被弃用

host
,但这是一段安全的代码,可以克服在代理后面/不在代理后面运行 Express 服务器的问题。

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

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


3
投票

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

这个快递来源会有帮助的:

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

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

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


0
投票

在 Express 5(仍处于测试阶段)中,

req.host
返回
Host
标头的值(因此,如果它是非标准标头,则它包括端口),而不是
req.hostname
,后者仅返回主机名。

这也适用于

trust proxy
设置,因此如果远程地址是可信代理,它将返回
X-Forwarded-Host
标头的值。

© www.soinside.com 2019 - 2024. All rights reserved.