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

aar*_*les 47 node.js express

我正在使用nodejs和expressjs.我想知道request.headers.protocol在clientRequest对象中是否有类似的东西.我想为web链接构建baseUrl.因此,如果请求是通过https完成的,我想在所有链接中保留https.

    var baseUrl = request.headers.protocol + request.headers.host;
Run Code Online (Sandbox Code Playgroud)

Lin*_*iel 84

编辑:对于Express,它更安全,建议使用req.secure(如下面的@Andy推荐).虽然它使用类似的实现,但它将来可以安全使用,并且它还可以选择支持X-Forwarded-Proto标头.

话虽这么说,对于你的用例,使用Express' req.protocol属性会更快,这是http或者https.但请注意,对于传出链接,您只需参考//example.com/path,浏览器将使用当前协议.(另请参阅我可以将所有http://链接更改为//?)

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

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

编辑: 对于Node 0.6.15+,API已更改:

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

另外(来自文档):

通过HTTPS支持,使用request.connection.verifyPeer()和request.connection.getPeerCertificate()来获取客户端的身份验证详细信息.

  • 我正在运行 NodeJs v11.5.0 并且请求对象不包含`.connection.encrypted`——我现在怎么知道? (4认同)
  • 这仍然可以在0.10及更新的最新节点中使用吗? (3认同)
  • 至少[当使用express]时(http://expressjs.com/de/api.html#req.secure),可以依赖于`req.secure`(作为布尔属性)或者同样''https'== req.protocol` (2认同)
  • 这个答案可能已经过时了。我正在 aws w/ssl 上运行 NodeJS 服务器,并且加密未定义 (2认同)
  • 尝试“req.socket.encrypted”。在 Node.js 的最新版本中,“.connection”属性已更改为“.socket”属性。https://nodejs.org/dist/latest-v12.x/​​docs/api/http.html#http_message_socket (2认同)

Ben*_*air 44

req.securereq.protocol === 'https'你应该寻找的简写.

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

app.enable('trust proxy');

  • 很好地提到`app.enable('trust proxy');`不使用它导致重定向循环. (3认同)
  • @Ben节点v5.x与此有什么关系?请阅读express 4.x的文档(这是迄今为止最新的):https://expressjs.com/en/4x/api.html#req.protocol (2认同)

tjk*_*emz 8

对于纯 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];
}
Run Code Online (Sandbox Code Playgroud)


Ger*_*ima 7

您无需在URL中指定协议,因此您无需担心此问题.

如果您使用<img src="//mysite.comm/images/image.jpg" />浏览器,则在HTTP中提供页面时将使用HTTP,如果页面在HTTPS中提供,则将使用HTTPS.请参阅另一个帖子中的@Jukka K. Korpela解释.

  • 谢谢Gerardo,你是对的但是对于这个项目,我需要检测协议. (2认同)

小智 5

如果您想知道请求是http还是https,请在代码 req.headers.referer.split(':')[0];中使用它。 这将返回req是http还是https

  • 仅当用户从同一站点重定向时才有效,当用户通过直接在浏览器导航栏中输入域名来访问该站点时,它将不起作用 (2认同)