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 の冗長な「安全な」ラベルの代わりに、特定のパスをrequireHTTPまたはとしてマークすることを提案しますrequireHTTPSapp.get複数のメソッドをおよび他のそのようなルーターメソッドに渡すことができることを知っていますよね? andを定義すると仮定するrequireHTTPrequireHTTPS(元の関数と同じになります)、次のようにします。

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 に答える