Express下更复杂的静态文件服务

时间:2012-07-05 18:54:10

标签: node.js express

最好用一个例子来解释。假设我有一个目录/图像,我有图像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()执行此操作,但我更喜欢使用内置功能(如果存在)或某人的优化模块,同时不会丢失可能由中间件提供的好处(缓存等)

1 个答案:

答案 0 :(得分: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();
      });
   }
 });

如果您出于某种原因想要访问原始网址,它仍可在req.originalUrl

上找到