如何知道在node.js中请求是http还是https

我正在使用nodejs和expressjs。 我不知道在requestRequest对象中是否有像request.headers.protocol这样的东西。 我想build立网页链接的baseUrl。 所以如果请求是通过https完成的,我想在所有链接中保留https。

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

编辑:对于Express,这是更安全的,build议使用req.secure (@Andy下面推荐)。 虽然它使用了一个类似的实现,但是对于将来的使用也是安全的,它也可以select性地支持X-Forwarded-Proto头文件。

对于没有Express的节点Request对象:

它在req.connection.secure (布尔)。

编辑: API已经改变, 节点0.6.15+

HTTPS连接具有req.connection.encrypted (一个包含有关SSL连接信息的对象)。 HTTP连接没有req.connection.encrypted

另外(从文档 ):

通过HTTPS支持,使用request.connection.verifyPeer()和request.connection.getPeerCertificate()来获取客户端的authentication细节。

req.securereq.secure的缩写req.protocol === 'https'应该是你要找的。

如果您在代理后面运行应用程序,请启用“信任代理”,以便req.protocol反映用于在客户端和代理之间进行通信的协议。

app.enable('trust proxy');

您不需要在URL中指定协议,因此您不需要打扰此问题。

如果您使用<img src="//mysite.commhttp://img.dovov.comimage.jpg" />那么浏览器将使用HTTP(如果页面以HTTP方式提供),并且如果以HTTPS方式提供页面,将使用HTTPS。 在另一个线程中查看@Jukka K. Korpela的解释 。

如果你想知道请求是http还是https,那么在你的代码中使用这个请求req.headers.referer.split(':')[0]; 这将返回是否req是http或https

这对我工作:

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

希望这有助于,

Ë

如果您正在使用请求模块,并且想要知道某些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]; 就像@哈尔给你的。

对于纯粹的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]; } 

在一个函数中:

 function getBaseUrl(req) { return req.protocol + '://' + req.headers.host + '/'; } var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/