Подтвердить что ты не робот

Как узнать, является ли запрос http или https в node.js

Я использую nodejs и expressjs. Интересно, есть ли что-то вроде request.headers.protocol в объекте clientRequest. Я хотел бы создать baseUrl для веб-ссылок. Поэтому, если запрос был выполнен с помощью https, я бы хотел сохранить https во всех ссылках.

    var baseUrl = request.headers.protocol + request.headers.host;
4b9b3361

Ответ 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