我正在使用nodejs和expressjs。我想知道clientRequest对象中是否有类似request.headers.protocol
的内容。我想为web链接构建baseUrl。因此,如果请求是通过https完成的,我希望将https保留在所有链接中。
var baseUrl = request.headers.protocol + request.headers.host;
答案 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.secure
是req.protocol === 'https'
的简写,应该是您所寻找的。 p>
如果您在代理后面运行您的应用,请启用“信任代理”,以便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/