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

时间:2012-04-27 10:22:06

标签: node.js express

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

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

10 个答案:

答案 0 :(得分:78)

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

话虽如此,对于您的用例,使用Express http属性会更快,https//example.com/path。但请注意,对于传出链接,您只需引用Request,浏览器将使用当前协议。 (另见req.protocol

对于没有Express的节点req.connection.secure对象:

它位于req.connection.encrypted(布尔值)。

修改 对于 Node 0.6.15 +

,API已更改

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

另外(来自Can I change all my http:// links to just //?):

  

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

答案 1 :(得分:41)

req.securereq.protocol === 'https'的简写,应该是您所寻找的。

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

app.enable('trust proxy');

答案 2 :(得分:6)

您无需在URL中指定协议,因此您无需为此问题烦恼。

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

对于纯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];
}

答案 5 :(得分:1)

这对我有用:

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

希望这有帮助,

电子

答案 6 :(得分:1)

如果您正在使用请求模块,例如想知道某些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(&#39;:&#39;)[0]; ,就像 @Harsh 一样给了你。

答案 7 :(得分:1)

这对我有用:

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

答案 8 :(得分:0)

如果您使用的是诸如Nginx之类的代理服务器,则应在其配置文件中设置proxy_set_header X-Forwarded-Proto https;,因此,如果您使用的是TSL,express可以将https识别为req.headers['x-forwarded-proto']的值或true的{​​{1}}

答案 9 :(得分:-1)

在一个功能中:

function getBaseUrl(req) {
    return req.protocol + '://' + req.headers.host + '/';
}

var baseUrl = getBaseUrl(request); // Example: http://localhost:3000/