我正在使用带节点的expressjs并同时运行https和http。
我想要求/secure/*
的所有路由都使用https。这样做了:
app.all("/secure/*", function(req, res, next) {
if (!req.connection.encrypted) {
res.redirect("https://" + req.headers["host"].replace(new RegExp(config.http_port, "g"), config.https_port) + req.url);
} else {
return next();
};
});
但是,我还要求所有未使用/secure/*
并尝试访问https的路由使用相同的方法重定向到http。
我试过这样做:
app.all("*", function(req, res, next) {
console.log(req);
if (req.connection.encrypted) {
res.redirect("http://" + req.headers["host"].replace(new RegExp(config.https_port, "g"), config.http_port) + req.url);
} else {
return next();
};
});
但是在访问https页面时我最终会进入重定向循环。有没有办法指定所有路由,除了那些/secure/*
?
谢谢!
答案 0 :(得分:4)
解决问题的简单方法是:
app.all("*", function(req, res, next) {
if (req.connection.encrypted && !/^\/secure/.test(req.url)) {
res.redirect("http://" + req.headers["host"].replace(new RegExp(config.https_port, "g"), config.http_port) + req.url);
} else {
return next();
};
});
如果网址不以/secure
开头,则只进行重定向。
但是,我建议不要在网址中使用冗余的“安全”标签,只需将某些路径标记为requireHTTP
或requireHTTPS
。你知道你可以将多种方法传递给app.get
和其他这样的路由器方法,对吗?假设您定义requireHTTP
和requireHTTPS
(与原始函数相同),您只需:
app.get("/path/to/keep/encrypted", requireHTTPS, function(req, res) {
// Rest of controller
});
app.get("/path/to/keep/public", requireHTTP, function(req, res) {
// Rest of controller
});
app.get("/path/you/dont/care/about/encryption/status", function(req, res) {
// Rest of controller
});
应该这样做。