如何知道在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.secure
是req.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/