有时我想从我的节点应用程序通过邮件发送合格的 URL。或者我想设置幻像页面对象的内容。
我在部署设置中获得了这样的完整 URL。
'http://' + req.hostname + '/myapp'
但是在开发机器上这通常会产生:
http://localhost/myapp而不是关闭http://localhost:3000/myapp
我知道如何获取端口,但我不想使用类似的东西:
'http://' + req.hostname + ':' + port + '/myapp'
在代理后面部署时会产生这样的废话。
如果应用程序在代理外部运行,是否有一种智能方法可以从请求对象获取带有端口的主机名?
我不确定为什么 Express Request 被弃用
host
,但这是一段安全的代码,可以克服在代理后面/不在代理后面运行 Express 服务器的问题。
const proxyHost = req.headers["x-forwarded-host"];
const host = proxyHost ? proxyHost : req.headers.host;
(我发现最方便的是为涉及重定向的工作流程构建“返回”URL,例如:OAuth 2)
您正在寻找的是 X-Forwarded-For 标头。如果您使用代理、负载均衡器等,这是获取原始 url 的最安全方法。检查您的请求中是否存在,如果存在则使用它,否则使用您已经实现的内容。
这个快递来源会有帮助的:
req.hostname 的值源自于中设置的值 X-Forwarded-Host 标头,可以由客户端或客户端设置 代理。
X-Forwarded-Proto 可以通过反向代理设置来告诉应用程序 无论是 https 还是 http,甚至是无效的名称。这个值是 由 req.protocol 反映。
req.ip 和 req.ips 值由以下列表填充 来自 X-Forwarded-For 的地址。
req.host
返回 Host
标头的值(因此,如果它是非标准标头,则它包括端口),而不是 req.hostname
,后者仅返回主机名。
这也适用于
trust proxy
设置,因此如果远程地址是可信代理,它将返回 X-Forwarded-Host
标头的值。