如何知道node.js中的请求是http还是https
我正在使用nodejs和expressjs。我想知道clientRequest对象中是否有类似于如何知道node.js中的请求是http还是https,node.js,express,Node.js,Express,我正在使用nodejs和expressjs。我想知道clientRequest对象中是否有类似于request.headers.protocol的内容。我想为web链接构建baseUrl。因此,如果请求是通过https完成的,我希望在所有链接中保留https var baseUrl = request.headers.protocol + request.headers.host; 您不需要在URL中指定协议,因此不需要为这个问题操心 如果您使用,则如果页面以HTTP方式提供,浏览器将
request.headers.protocol
的内容。我想为web链接构建baseUrl。因此,如果请求是通过https完成的,我希望在所有链接中保留https
var baseUrl = request.headers.protocol + request.headers.host;
您不需要在URL中指定协议,因此不需要为这个问题操心
如果您使用
,则如果页面以HTTP方式提供,浏览器将使用HTTP;如果页面以HTTPS方式提供,浏览器将使用HTTPS。请参阅另一个线程。编辑:对于Express,它更安全,建议使用(如下面@Andy所建议的)。虽然它使用了类似的实现,但在将来使用时是安全的,并且还可以选择支持X-Forwarded-Proto
头
也就是说,对于您的用例,使用Express属性会更快,它是http
或https
。但是请注意,对于传出链接,您可以只参考//example.com/path
,浏览器将使用当前协议。(另见)
对于节点请求
对象,不带Express:
它位于请求连接.secure
(布尔值)中
编辑:
对于节点0.6.15+,API已更改:
HTTPS连接具有req.connection.encrypted
(包含SSL连接信息的对象)。HTTP连接没有req.connection.encrypted
还(来自):
使用HTTPS支持,使用request.connection.verifyPeer()和request.connection.getPeerCertificate()获取客户端的身份验证详细信息
这对我很有用:
req.headers['x-forwarded-proto']
希望这有帮助
E
req.secure
是req.protocol==='https'
的简写形式,应该是您需要的
如果在代理后运行应用程序,请启用“信任代理”,以便req.protocol
反映用于客户端和代理之间通信的协议
app.enable('trust proxy')代码>如果您想知道请求是http还是https,请在代码中使用:
req.headers.referer.split(':')[0];
这将返回req是http还是https。如果您正在使用请求模块,例如想知道一些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给你的一样。对于纯nodej(这可以在本地工作并部署,例如在Nginx后面):
这对我来说很有用:
getAPIHostAndPort = function(req, appendEndSlash) {
return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}
如果您使用的是代理服务器,如Nginx,则应设置Proxy\u set\u头X-Forwarded-Proto-https代码>在其配置文件中,因此如果您使用TSL
express,则可以将https
识别为req.headers['x-forwarded-proto']
值或true
用于req.secure谢谢Gerardo,您是对的,但对于这个项目,我需要检测协议。但对于通用应用程序来说,情况并非如此,在服务器上,您必须指定协议注意,只有当您的应用程序运行在设置此标头的反向代理之后时,这才有效-这是一个好主意,但可能不是这样,尤其是在本地开发环境中。(另外,请记住,如果您不在代理后面,客户端可能会欺骗头部,因此请注意您如何信任它。)此外,在某些情况下,这会为您提供ip而不是http主机!我正在使用OpenShift,这是该服务的正确答案(req.secure和req.protocol不工作);我只是想提醒一下,以防其他人也这么做。这在最新的节点0.10和更高版本中仍然可用吗?嗯,你能为更高版本的节点(如0.8和更高版本)验证这一点吗?我在文档中找不到任何类似的内容。但可能是我读错了地方。至少,可以依赖req.secure
(作为布尔属性)或类似的'https'==req.protocol
我正在运行NodeJs v11.5.0,请求对象不包含.connection.encrypted
——我现在该怎么说呢?试试req.socket.encrypted
。在Node.js的最新版本中,.connection
属性更改为.socket
属性。哦,对了,与require('url').parse(..).protocol混为一谈app.enable('trust proxy')代码>不使用它会导致重定向循环。@Ben节点v5.x与此有什么关系?请阅读Express4.x(目前为止最新版本)的文档:它仅在用户从同一站点重定向时有效,当用户通过直接在浏览器导航栏中输入域来访问站点时,它将不起作用
getAPIHostAndPort = function(req, appendEndSlash) {
return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}