Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道node.js中的请求是http还是https_Node.js_Express - Fatal编程技术网

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

如何知道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方式提供,浏览器将

我正在使用nodejs和expressjs。我想知道clientRequest对象中是否有类似于
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 ? '/' : '');
}