How to know if a request is http or https in node.js

前端 未结 9 1204
别跟我提以往
别跟我提以往 2020-12-08 04:11

I am using nodejs and expressjs. I wonder if there is something like request.headers.protocol in the clientRequest object. I would like to build the baseUrl for

相关标签:
9条回答
  • 2020-12-08 04:17

    If you want to know whether request is http or https then use this in your code:

    req.headers.referer.split(':')[0];
    

    This will return whether req is http or https.

    0 讨论(0)
  • 2020-12-08 04:17

    This worked for me:

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

    Hope this helped,

    E

    0 讨论(0)
  • 2020-12-08 04:20

    Edit: For Express, it's safer and recommended to use req.secure (as @Andy recommends below). While it uses a similar implementation, it will be safe for future use and it also optionally supports the X-Forwarded-Proto header.

    That being said, for your use case it would be quicker to use Express' req.protocol property, which is either http or https. Note, however, that for outgoing links, you can just refer to //example.com/path, and the browser will use the current protocol. (See also Can I change all my http:// links to just //?)

    For node Request object without Express:

    It's in req.connection.secure (boolean).

    Edit: The API has changed, for Node 0.6.15+:

    An HTTPS connection has req.connection.encrypted (an object with information about the SSL connection). An HTTP connection doesn't have req.connection.encrypted.

    Also (from the docs):

    With HTTPS support, use request.connection.verifyPeer() and request.connection.getPeerCertificate() to obtain the client's authentication details.

    0 讨论(0)
  • 2020-12-08 04:20

    You don't need to specify the protocol in URL, thus you don't need to bother with this problem.

    If you use <img src="//mysite.comm/images/image.jpg" /> the browser will use HTTP if the page is served in HTTP, and will use HTTPS if the page is served in HTTPS. See the @Jukka K. Korpela explanation in another thread.

    0 讨论(0)
  • 2020-12-08 04:21

    For pure NodeJS (this works locally and deployed, e.g. behind 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];
    }
    
    0 讨论(0)
  • 2020-12-08 04:23

    This is what works for me:

    getAPIHostAndPort = function(req, appendEndSlash) {
        return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
    }
    
    0 讨论(0)
提交回复
热议问题