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