66

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

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

10 回答 10

104

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

话虽如此,对于您的用例,使用 Express 的属性会更快req.protocol,即httpor 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() 获取客户端的身份验证详细信息。

于 2012-04-27T15:15:20.907 回答
53

req.securereq.protocol === 'https'应该是你要找的东西的简写。

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

app.enable('trust proxy');

于 2013-05-06T19:16:51.877 回答
10

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

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

于 2012-04-27T10:36:42.137 回答
9

对于纯 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];
}
于 2017-02-21T04:09:10.183 回答
4

如果您想知道请求是 http 还是 https,请在您的代码中使用:

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

这将返回 req 是 http 还是 https。

于 2016-10-10T17:27:19.677 回答
3

这对我有用:

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

希望这有帮助,

于 2012-12-17T18:25:52.317 回答
2

这对我有用:

getAPIHostAndPort = function(req, appendEndSlash) {
    return (req.connection && req.connection.encrypted ? 'https' : 'http') + '://' + req.headers.host + (appendEndSlash ? '/' : '');
}
于 2018-05-23T21:29:02.017 回答
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(':')[0]; 就像@Harsh给你的一样。

于 2017-02-11T01:04:24.847 回答
0

如果您使用的是 Nginx 等代理服务器,您应该proxy_set_header X-Forwarded-Proto https;在其配置文件中进行设置,因此如果您使用的是TSLexpress,则可以识别httpsreq.headers['x-forwarded-proto']value 或trueforreq.secure

于 2019-07-28T03:54:57.193 回答
0

如果要查找请求协议字符串:http 或(对于 TLS 请求)https 只需使用

 req.protocol

快递文档:https ://expressjs.com/en/4x/api.html#req.protocol

于 2021-11-05T11:11:43.803 回答