Как получить текущий адрес домена в sails.js
Я пытаюсь получить текущий веб-адрес, используя sails.js.
Я попробовал следующее:
req.param('host') and req.param('X-Forwarded-Protocol')
возвращает неопределенное.
req.headers.host
возвращает localhost. но мой домен не является localhost.
Как получить его??
6 ответов
Просто в качестве предисловия к этому ответу: не существует надежного кроссплатформенного способа автоматического определения внешнего URL-адреса работающего приложения Sails (или любого другого приложения Node).
getBaseUrl()
метод, описанный ниже, использует комбинацию предоставленных пользователем и значений конфигурации по умолчанию, чтобы сделать правильное предположение по URL-адресу приложения. В критических ситуациях рекомендуется предварительно определить URL-адрес и сохранить его в настраиваемом параметре конфигурации, зависящем от среды (например,sails.config.appUrl
) что вы можете ссылаться в другом месте в приложении.
Если вы на Sails >= v0.10.x, вы можете использовать sails.getBaseurl()
чтобы получить полный протокол, домен и порт, с которого обслуживается ваше приложение. Начиная с Sails v0.10.0-rc6, это также проверяет sails.config.proxyHost
а также sails.config.proxyPort
, который вы можете установить вручную в одном из ваших файлов конфигурации (например, config/local.js
) если ваше приложение обслуживается через прокси-сервер (например, если оно развернуто на Modulus.io или прокси-сервер через сервер Nginx).
Паруса 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()
в ваших взглядах..
Я попробовал несколько примеров, которые я нашел в 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
Кажется, он работает, но, как вы можете видеть, это IP-адрес IPv6, так что это не то, что я хотел.
И пример № 3 вернулся:
187.214.247.196
Так что это отлично, потому что это то, что мне было нужно.
Все, что я должен сказать, это то, что пример № 3 работал нормально, но только в производственной среде (с использованием Heroku), а не для разработки на моей локальной машине.
На паруса 0.10.x вы можете сделать это:
//inside controller action
var baseURL = req.protocol + '://' + req.host;
req.protocol
даст вам "http" или "https" (или любой другой протокол приложения). req.host
будет заголовком хоста, например, "sub.domain.com"
Как отмечено в комментарии выше, sails.getBaseURL()
или любой из его вариантов обычно возвращает localhost, даже в производственной среде.
Это код, который я использую для получения IP-адреса любого сервера на основе Node.js, и он работает с 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);
}
...