如何在sails.js中获取当前的域名地址
我试图使用sails.js获取当前url。
我尝试了以下内容:
req.param('host') and req.param('X-Forwarded-Protocol')
返回undefined。
req.headers.host
返回localhost。 但我的域名不是本地主机。
如何得到它?
只是为了说明这个答案:没有可靠的,跨平台的方式来自动检测正在运行的Sails应用程序(或任何其他节点应用程序)的外部URL。 下面介绍的
getBaseUrl()
方法使用用户提供的和默认configuration值的组合来对应用程序的URL进行最佳猜测。 在任务关键的情况下,build议您预先确定URL并将其保存在自定义的环境相关configuration值 (例如sails.config.appUrl
)中,您可以在应用程序的其他位置参考该configuration值 。
如果您使用的是Sails> = v0.10.x,则可以使用sails.getBaseurl()
来获取应用程序的完整协议,域和端口。 从Sails v0.10.0-rc6开始,这也检查了sails.config.proxyHost
和sails.config.proxyPort
,你可以在你的一个configuration文件(如config/local.js
)中手动设置,如果你的应用程序正在通过代理服务器(例如,如果它部署在Modulus.io,或通过Nginx服务器代理)。
Sails v0.9.x没有sails.getBaseurl
,但是您可以随时尝试复制代码并实现自己,可能在服务中 :
getBaseUrl
function getBaseurl() { var usingSSL = sails.config.ssl && sails.config.ssl.key && sails.config.ssl.cert; var port = sails.config.proxyPort || sails.config.port; var localAppURL = (usingSSL ? 'https' : 'http') + '://' + (sails.getHost() || 'localhost') + (port == 80 || port == 443 ? '' : ':' + port); return localAppURL; };
你会注意到这依赖于sails.getHost()
,它看起来像:
function getHost() { var hasExplicitHost = sails.config.hooks.http && sails.config.explicitHost; var host = sails.config.proxyHost || hasExplicitHost || sails.config.host; return host; };
在Sails v0.10中,您可以在视图中通过req.baseUrl
或sails.getBaseurl()
访问它。
我已经尝试了一些我发现在谷歌的例子,但似乎至less在我的本地机器上工作。
-
在我的本地机器上使用这个返回:
req.ip; --> ::1
-
在我的本地机器上使用这个返回:
req.headers['x-forwarded-for']; --> undefined
-
最后,在我的本地机器上使用这个返回:
var paramIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress; --> ::1
似乎没有任何工作。 然后我在production environment
尝试并返回第一个示例:
req.ip; --> ::ffff:10.155.43.243
它似乎正在工作,但你可以看到它是一个IPv6的IP地址,所以这不是我想要的。
而例子3返回:
187.214.247.196
所以这很好,因为这是我所需要的。
所有我必须说的是,3号的例子工作正常,但只是在生产环境( 使用Heroku ),而不是在我的本地机器的发展。
req.host应该包含主机值。
在风帆0.10.x,你可以这样做:
//inside controller action var baseURL = req.protocol + '://' + req.host;
req.protocol
会给你'http'或'https'(或任何应用程序协议)。 req.host
将是主机的头,例如'sub.domain.com'
正如上面注释中所指出的,即使在生产环境中, sails.getBaseURL()
或其任何变体通常都会返回localhost。
这是我用来获取任何基于Node.js的服务器的IP的代码,它可以与Sails.js一起使用:
var os = require('os'); .... getIpAddress: function() { var ifaces = os.networkInterfaces(); for (k in ifaces) { for (k2 in ifaces[k]) { var address = ifaces[k][k2]; if (address.family == 'IPv4' && !address.internal) { return(address.address); } } } return(null); } ...