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

node.jsExpress

node.js Problem Overview


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 the web links. So if the request was done via https I would like to keep https in all links.

    var baseUrl = request.headers.protocol + request.headers.host;

node.js Solutions


Solution 1 - node.js

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 https://stackoverflow.com/questions/4831741/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.

Solution 2 - node.js

req.secure is a shorthand for req.protocol === 'https' should be what you looking for.

If you run your app behind proxy, enable 'trust proxy' so req.protocol reflects the protocol that's been used to communicate between client and proxy.

app.enable('trust proxy');

Solution 3 - node.js

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.

Solution 4 - node.js

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];
}

Solution 5 - node.js

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.

Solution 6 - node.js

This worked for me:

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

Hope this helped,

E

Solution 7 - node.js

This is what works for me:

getAPIHostAndPort = function(req, appendEndSlash) {
    return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}

Solution 8 - node.js

If you are using request module and for example want to know what protocol does some www use, you can use: 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
	}
});

If you need user protocol then use request.headers.referer.split(':')[0]; just like @Harsh gave you.

Solution 9 - node.js

If you want to find the request protocol string: either http or (for TLS requests) https just use

 req.protocol

Express documentation: https://expressjs.com/en/4x/api.html#req.protocol

Solution 10 - node.js

If you are using Proxy Server such as Nginx you should set proxy_set_header X-Forwarded-Proto https; in its config file, so if you are using TSL express could recognize https as req.headers['x-forwarded-proto'] value or true for req.secure

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionaartilesView Question on Stackoverflow
Solution 1 - node.jsLinus ThielView Answer on Stackoverflow
Solution 2 - node.jsRob ZombieView Answer on Stackoverflow
Solution 3 - node.jsGerardo LimaView Answer on Stackoverflow
Solution 4 - node.jstjklemzView Answer on Stackoverflow
Solution 5 - node.jsHarshView Answer on Stackoverflow
Solution 6 - node.jsuser1910814View Answer on Stackoverflow
Solution 7 - node.jsNicoView Answer on Stackoverflow
Solution 8 - node.jsb4rtekbView Answer on Stackoverflow
Solution 9 - node.jsSpandan JoshiView Answer on Stackoverflow
Solution 10 - node.jsMajidJafariView Answer on Stackoverflow