如何在express中的子目录上设置缓存头

时间:2013-03-15 16:13:08

标签: node.js caching express

当使用express与node.js时,您可以控制公共资源的缓存头,如下所示:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));

将公用文件夹下的所有内容设置为静态可用,缓存超时为1年。但是,如果我想为公共下的其他文件设置不同的超时值呢?假设我在公共/图像/图标下有一些图像,我希望它具有1年的较小值?我试着像这样添加第二次静态调用:

app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));
app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));

但它不起作用。它似乎只是忽略了第二个陈述。想法?

3 个答案:

答案 0 :(得分:4)

快速测试中间件的顺序,所以如果你先把最具体的express.static调用,那么它应该工作,即

app.use(express.static(path.join(__dirname, 'public/images/icons'), { maxAge: 12345 }));
app.use(express.static(path.join(__dirname, 'public/images'), { maxAge: 1234567 }));
app.use(express.static(path.join(__dirname, 'public/else'), { maxAge: 9874567 }));
app.use(express.static(path.join(__dirname, 'public'), { maxAge: 31557600000 }));

编辑:

这不会保留路径,所以我会这样做

function static(dirname, age) {
    return express.static(path.join(__dirname, dirname), { maxAge: age });
}

然后致电

app.use('/public/images/icons', static('public/images/icons', 12345));
app.use('/public/images/', static('public/images', 1234567);

这背后的原因是我之前的解决方案在根位置安装了所有静态文件,而此解决方案使用正确的maxAge将每个目录挂载到该文件路径

答案 1 :(得分:1)

静态中间件的source code显示它拦截了来自url的路径部分的任何看起来像文件路径的内容,从配置的根目录中统计该文件并在其存在时提供它。

使用vanilla中间件无法更改maxAge选项。

我建议您制作自己的中间件(只是一个函数)并创建适当数量的静态中间件(在每个目录上)并将req, res, next参数转发到正确的

答案 2 :(得分:0)

您需要将public内的每个文件夹挂载到其路径上,因为它将是服务器。也就是说,没有public

app.use('/css', express.static(__dirname + '/public/css', {  maxAge: '1h'}));
app.use('/img', express.static(__dirname + '/public/img', {  maxAge: '1h'}));
app.use('/fonts', express.static(__dirname + '/public/fonts', {  maxAge: '1h'}));
app.use(express.static(path.join(__dirname, 'public')));