如何在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.proxyHostsails.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.baseUrlsails.getBaseurl()访问它。

我已经尝试了一些我发现在谷歌的例子,但似乎至less在我的本地机器上工作。

  1. 在我的本地机器上使用这个返回:

     req.ip; --> ::1 
  2. 在我的本地机器上使用这个返回:

     req.headers['x-forwarded-for']; --> undefined 
  3. 最后,在我的本地机器上使用这个返回:

     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); } ...