【发布时间】:2014-05-13 08:12:07
【问题描述】:
我尝试使用sails.js 获取当前网址。
我尝试了以下方法:
req.param('host') and req.param('X-Forwarded-Protocol')
返回未定义。
req.headers.host
返回 localhost。 但我的域不是 localhost。
如何获得??
【问题讨论】:
我尝试使用sails.js 获取当前网址。
我尝试了以下方法:
req.param('host') and req.param('X-Forwarded-Protocol')
返回未定义。
req.headers.host
返回 localhost。 但我的域不是 localhost。
如何获得??
【问题讨论】:
只是作为这个答案的序言:没有可靠的跨平台方法来自动检测正在运行的 Sails 应用程序(或任何其他 Node 应用程序)的外部 URL。下面描述的
getBaseUrl()方法结合使用用户提供的 和默认配置值来对应用程序的URL 做出最佳猜测。在任务关键的情况下,建议您预先确定 URL 并将其保存在自定义的 environment-dependent configuration value(例如sails.config.appUrl)中,您可以在应用程序的其他地方引用。
如果您使用的是 Sails >= v0.10.x,您可以使用 sails.getBaseurl() 来获取您的应用所使用的完整协议、域和端口。从 Sails v0.10.0-rc6 开始,这还会检查 sails.config.proxyHost 和 sails.config.proxyPort,如果您的应用程序通过代理(例如如果它部署在 Modulus.io 上,或者通过 Nginx 服务器代理)。
Sails v0.9.x 没有sails.getBaseurl,但您始终可以尝试复制代码并自己实现,可能在service 中:
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() 访问它。
【讨论】:
我尝试了一些我在 google 中找到的示例,但至少在我的本地计算机上似乎没有任何效果。
在我的本地机器上使用它返回:
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 应包含主机值。
【讨论】:
在sails 0.10.x 上,您可以这样做:
//inside controller action
var baseURL = req.protocol + '://' + req.host;
req.protocol 将为您提供“http”或“https”(或任何应用程序协议)。 req.host 将是主机的标题,例如'sub.domain.com'
如上面评论中所述,sails.getBaseURL() 或其任何变体通常会返回 localhost,即使在生产环境中也是如此。
【讨论】:
baseURL 作为参数传递给他的服务(假设它是从控制器调用的)。在其他情况下,我会像这样在服务中做一些愚蠢的事情:var baseUrl = (process.env.NODE_ENV=='development') ? 'http://localhost:133/' : 'https://myappexamplesite.com'
这是我用于获取任何基于 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);
}
...
【讨论】: