1

我正在使用带有节点的 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/*

谢谢!

4

1 回答 1

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();
    };
});

仅当 URL 不以 . 开头时才进行重定向/secure

但是,我建议不要在 URL 中使用多余的“安全”标签,而是将某些路径标记为requireHTTPrequireHTTPS。您知道您可以将多个方法传递给app.get其他此类路由器方法,对吗?假设您定义requireHTTPand 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
});

那应该这样做。

于 2012-05-24T20:02:51.333 回答