3

最好用一个例子来解释。假设我有一个目录 /images,其中有图像 a.png、b.png 和 c.png。

然后我有一个目录/foo/images,里面有一个图片b.png,和/images中的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,它仍然可以在req.originalUrl

于 2012-07-05T20:20:58.317 回答