3

例で最もよく説明されます。ディレクトリ/imagesがあり、そこに画像a.png、b.png、c.pngがあるとします。

次に、ディレクトリ/ foo / imagesがあります。このディレクトリには、/imagesのb.pngとは異なる画像b.pngがあります。

http://mydomain.com/foo/images/a.pngのリクエストが届くと、画像/images/a.pngが提供されるようにしたいと思います。ただし、http: //mydomain.com/foo/images/b.pngのリクエストが届くと、/ foo/imagesにあるバージョンのb.pngが取得されます。つまり、最初にfoo / images /をチェックし、その名前のファイルがない場合は/imagesにフォールバックします。

これはres.sendfile()を使用して行うことができますが、ミドルウェアによって提供される可能性のある利点(キャッシュなど)を失わずに、組み込み機能が存在する場合はそれを使用するか、誰かの最適化されたモジュールを使用することをお勧めします。

4

1 に答える 1

3

これにより、リクエストが傍受/foo/images/され、ファイルが存在しない場合はリダイレクトされますが、静的ミドルウェアと適切なキャッシュが引き続き使用されます。

var imageProxy = require('./imageProxy.js');

// intercept requests before static is called and change the url
app.use( imageProxy );

// this will still get cached
app.use( express.static(__dirname + '/public') );

そして imageProxy.js 内:

var url = require('url');
var fs  = require('fs');
var ROOT = process.execPath + '/public';

exports = function(req, res, next) {
   var parts = url.parse(req.url);
   // find all urls beginnig with /foo/images/
   var m = parts.pathname.match(/^(\/foo(\/images\/.*))/);
   if( m ) {
      // see if the override file exists
      fs.exists(ROOT+m[1], function (exists) {
         if( !exists ) { req.url = ROOT+m[2]; }
         // pass on the results to the static middleware
         next();
      });
   }
 });

何らかの理由で元の URL にアクセスしたい場合は、引き続き次の URL で入手できます。req.originalUrl

于 2012-07-05T20:20:58.317 に答える