2012-04-27 2 views
40

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

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

ответ

62

Редактировать: Для Экспресс это безопаснее и рекомендуется использовать req.secure (как @Andy рекомендует ниже). Хотя он использует аналогичную реализацию, он будет безопасен для будущего использования, а также опционально поддерживает заголовок X-Forwarded-Proto.

Это, как говорится, для вашего использования было бы быстрее использовать Экспресс 'req.protocol, либо http, либо https. Обратите внимание, однако, что для исходящих ссылок вы можете просто обратиться к //example.com/path, и браузер будет использовать текущий протокол. (Смотрите также Can I change all my http:// links to just //?)

Для узла Request объекта без Экспресс:

Это в req.connection.secure (булево).

Edit: API-интерфейс изменился, для узла 0.6.15+:

подключение к HTTPS имеет req.connection.encrypted (объект с информацией о соединении SSL). HTTP-соединение не имеет req.connection.encrypted.

Кроме того (от the docs):

С поддержкой HTTPS, используйте методы verifyPeer() и request.connection.getPeerCertificate(), чтобы получить данные для проверки подлинности клиента.

+3

Является ли это еще доступным в последнем узле 0.10 и выше? – CMCDragonkai

+1

Хм, можете ли вы проверить это для более поздних версий узлов, таких как 0,8 и выше, я не могу найти ничего подобного в документации. Но может быть, я читаю не в том месте. – Olga

+0

Это все еще существует в Node v5.x. – Ben

4

Вам не нужно указывать протокол по URL-адресу, поэтому вам не нужно беспокоиться об этой проблеме.

Если вы используете <img src="//mysite.comm/images/image.jpg" />, браузер будет использовать HTTP, если страница обслуживается в HTTP, и будет использовать HTTPS, если страница будет использоваться в HTTPS. См. the @Jukka K. Korpela explanation в другом потоке.

+1

Спасибо Херардо, вы правы, но для этого проекта мне нужно обнаружить протокол. – aartiles

+0

Но это не относится к универсальным приложениям, на сервере вы должны указать протокол –

2

Это работает для меня:

req.headers['x-forwarded-proto'] 

Надеется, что это помогло,

E

+2

Обратите внимание, что это будет работать, только если ваше приложение работает за обратным прокси-сервером, который устанавливает этот заголовок, что является хорошей идеей, но может быть не так, локальную среду разработки. (Кроме того, имейте в виду, что если вы * не * за прокси-сервером, клиент может обмануть заголовок, поэтому будьте осторожны, как вы ему доверяете.) – natevw

+0

Также это в некоторых случаях дает вам ip не http-хост! –

+0

Я использую OpenShift, и это правильный ответ для этой службы (req.secure и req.protocol не работают); просто подумал, что я упомянул бы, если кто-то другой тоже. – iangilman

34

req.secure является обобщающим для req.protocol === 'https' должна быть то, что вы ищете.

Если вы запустите приложение за прокси, включите «доверенный прокси», поэтому req.protocol отражает протокол, который использовался для связи между клиентом и прокси.

app.enable('trust proxy');

+0

@caub http://expressjs.com/ru/api.html#req.protocol – Andy

+0

oh right, confused with 'require ('url'). Parse (..). Protocol' – caub

+2

Приятный вызов при упоминании' app. enable ('trust proxy'); ' Не использовать это вызывало цикл перенаправления. –

3

Если вы хотите знать, запрос, является ли HTTP или HTTPS затем использовать это в вашем коде req.headers.referer.сплит (':') [0]; это вернет ли REQ является HTTP или HTTPS

1

Если вы используете модуль запроса и, например, хотите знать, какой протокол делает некоторые используют 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 дал вам.

1

Для чистых 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]; 
} 
0

В функции:

function getBaseUrl(req) { 
    return req.protocol + '://' + req.headers.host + '/'; 
} 

var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/