10

次のように、Express フレームワークとhttp-authモジュールを使用して設計された node.js アプリケーションがあります。

var auth = require('http-auth');
var express = require('express');
// ...
var mywebapp = express();
// ...
if (usebasicauth) {
  var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
  mywebapp.use(auth.connect(basic));
}

mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// ...

/jsただし、および/cssディレクトリの下にあるアセットを保護したくありません。これは私がやってみたものです:

if (usebasicauth) {
  var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
  mywebapp.use(function(req, res, next) {
    if (/^\/(css|js)/.test(req.url)) {
      next();
    }
    else {
      auth.connect(basic);
    }
  });
}

以下の URL にアクセスして、期待どおり/cssに動作しようとしています。/jsただし、他の URL は読み込まれません。

他の URL を期待どおりに機能させるにはどうすればよいですか?

4

3 に答える 3

12

の順番mywebapp.useが重要です。最初mywebapp.use(auth.connect(basic));に持っている場合はすべてのリクエストに使用されますが、順序を変更すると静的に渡され、それ以降のものにのみ使用されます。

ミドルウェア機能は、追加された順に処理されます。

したがって、以下はあなたが望むことをするはずです。

// no auth for statics
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// auth reguired from here 
mywebapp.use(auth.connect(basic));

mywebapp.use(auth.connect(basic));Express.static の上に配置すると、それにも認証が必要になります。

// auth reguired from here 
mywebapp.use(auth.connect(basic));
// auth required for statics as well
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
于 2015-12-26T17:58:22.077 に答える