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'
在代理后面部署会产生这样的废话。
如果应用程序在代理外运行,是否有一种聪明的方法从请求对象中获取主机名和端口?
您要查找的是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)
有时我想通过我的节点应用程序在邮件中发送合格的 URL。或者我想设置一个幻象页面对象的内容。
我在我的部署设置中得到了完整的 URL。
'http://' + req.hostname + '/myapp'
然而在开发机器上这通常会产生:
http://localhost/myapp instead off http://localhost:3000/myapp
我知道如何获取端口,但我不想使用类似的东西:
'http://' + req.hostname + ':' + port + '/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)