Как узнать, является ли запрос http или https в node.js
Я использую nodejs и expressjs. Интересно, есть ли что-то вроде request.headers.protocol
в объекте clientRequest. Я хотел бы создать baseUrl для веб-ссылок. Поэтому, если запрос был выполнен с помощью https, я бы хотел сохранить https во всех ссылках.
var baseUrl = request.headers.protocol + request.headers.host;
Ответы
Ответ 1
Изменить: Для Express безопаснее и рекомендуется использовать req.secure
(как рекомендует @Andy ниже). Хотя он использует аналогичную реализацию, он будет безопасен для будущего использования, а также дополнительно поддерживает заголовок X-Forwarded-Proto
.
При этом для вашего случая использования было бы быстрее использовать свойство Express req.protocol
, которое является либо http
, либо https
. Однако обратите внимание, что для исходящих ссылок вы можете просто обратиться к //example.com/path
, и браузер будет использовать текущий протокол. (См. также Могу ли я изменить все мои ссылки http://просто на //?)
Для объекта узла Request
без Express:
Это в req.connection.secure
(булево).
Изменить:
API изменен для узла 0.6. 15+:
HTTPS-соединение имеет req.connection.encrypted
(объект с информацией о SSL-соединении). HTTP-соединение не имеет req.connection.encrypted
.
Также (из документов):
С поддержкой HTTPS используйте request.connection.verifyPeer() и request.connection.getPeerCertificate() для получения деталей аутентификации клиента.
Ответ 2
req.secure
является сокращением для req.protocol === 'https'
должно быть то, что вы ищете.
Если вы запустите приложение за прокси, включите "доверенный прокси", поэтому req.protocol
отражает протокол, который использовался для связи между клиентом и прокси.
app.enable('trust proxy');
Ответ 3
Вам не нужно указывать протокол по URL-адресу, поэтому вам не нужно беспокоиться об этой проблеме.
Если вы используете <img src="//mysite.comm/images/image.jpg" />
, браузер будет использовать HTTP, если страница обслуживается в HTTP, и будет использовать HTTPS, если страница будет использоваться в HTTPS. См. объяснение @Jukka K. Korpela в другом потоке.
Ответ 4
Если вы хотите узнать, является ли запрос http или https, то используйте это в своем коде
req.headers.referer.split( ':') [0];
это вернет, будет ли req http или https
Ответ 5
Для чистого NodeJS (это работает локально и развернуто, например, за Nginx):
function getProtocol (req) {
var proto = req.connection.encrypted ? 'https' : 'http';
// only do this if you trust the proxy
proto = req.headers['x-forwarded-proto'] || proto;
return proto.split(/\s*,\s*/)[0];
}
Ответ 6
Это сработало для меня:
req.headers['x-forwarded-proto']
Надеюсь, это помогло,
Е
Ответ 7
Если вы используете модуль запроса и, например, хотите знать, какой протокол использует какой-либо www, вы можете использовать: response.request.uri.protocol
request(YOUR_TARGET, function(error, response, body){
if (error){
console.log(error);
}
else {
console.log(response.request.uri.protocol); // will show HTTP or HTTPS
}
});
Если вам нужен пользовательский протокол, используйте request.headers.referer.split(':') [0];, как @Harsh дал вам.
Ответ 8
Вот что у меня работает:
getAPIHostAndPort = function(req, appendEndSlash) {
return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}
Ответ 9
В функции:
function getBaseUrl(req) {
return req.protocol + '://' + req.headers.host + '/';
}
var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/
Ответ 10
Если вы используете прокси-сервер, такой как Nginx, вы должны установить proxy_set_header X-Forwarded-Proto https;
в его конфигурационном файле, так что если вы используете TSL
, экспресс может распознавать https
как значение req.headers['x-forwarded-proto']
или true
для req.secure