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

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

    var baseUrl = request.headers.protocol + request.headers.host;
aartiles asked 2020-06-27T05:16:16Z
9个解决方案
82 votes

编辑:对于Express,它更安全,建议使用req.connection.encrypted(如@Andy所建议的那样)。 尽管它使用类似的实现,但将来可以安全使用,并且还可以选择支持req.connection.encrypted标头。

话虽如此,对于您的用例,使用Express的req.connection.encrypted属性(即req.connection.encryptedreq.connection.encrypted)会更快。但是请注意,对于传出链接,您可以仅引用//example.com/path,浏览器将使用当前协议 。 (另请参见是否可以将我的所有[http://]链接更改为//?)

对于不带Express的节点req.connection.encrypted对象:

req.connection.encrypted(布尔值)中。

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

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

另外(来自文档):

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

Linus Gustav Larsson Thiel answered 2020-06-27T05:17:05Z
44 votes

app.enable('trust proxy');req.protocol === 'https'的简写,应该是您想要的。

如果您在代理后面运行应用程序,请启用“信任代理”,以便app.enable('trust proxy');反映出用于客户端与代理之间进行通信的协议。

app.enable('trust proxy');

highmaintenance answered 2020-06-27T05:17:34Z
7 votes

您无需在URL中指定协议,因此无需理会此问题。

如果您使用<img src="//mysite.comm/images/image.jpg" />,则该浏览器将使用HTTP(如果该页面以HTTP进行服务),并且将使用HTTPS(如果该页面以HTTPS进行服务)。 请参阅另一个线程中的@Jukka K.Korpela解释。

Gerardo Lima answered 2020-06-27T05:17:58Z
4 votes

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

Harsh answered 2020-06-27T05:18:18Z
4 votes

对于纯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];
}
tjklemz answered 2020-06-27T05:18:38Z
2 votes

这为我工作:

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

希望这对您有所帮助,

user1910814 answered 2020-06-27T05:19:07Z
1 votes

如果您正在使用请求模块,例如想知道某些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给你的一样。

b4rtekb answered 2020-06-27T05:19:32Z
1 votes

这对我有效:

getAPIHostAndPort = function(req, appendEndSlash) {
    return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}
Nico answered 2020-06-27T05:19:52Z
0 votes

如果您使用的是Proxy Server(例如Nginx),则应在其配置文件中设置proxy_set_header X-Forwarded-Proto https;,因此,如果您使用的是TSL express,则可以将https识别为req.headers['x-forwarded-proto']值,或者将29410042114437294294识别为req.secure

MajidJafari answered 2020-06-27T05:20:16Z
translate from https://stackoverflow.com:/questions/10348906/how-to-know-if-a-request-is-http-or-https-in-node-js