当我重新加载一个用express制作的网站时,我得到一个使用Safari (而不是Chrome)的空白页面,因为NodeJS服务器会给我一个304状态代码。
如何解决这个问题?
当然,这也可能只是Safari的一个问题,但实际上它在所有其他网站上都可以很好地工作,所以在我的NodeJS服务器上也一定是一个问题。
为了生成页面,我使用了带有res.render
的Jade。
更新:似乎这个问题的发生是因为Safari在重新加载时发送了'cache-control': 'max-age=0'
。
更新2:我现在有一个变通办法,但有没有更好的解决方案?解决方法:
app.get('/:language(' + content.languageSelector + ')/:page', function (req, res)
{
// Disable caching for content files
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
// rendering stuff here…
}
更新3:,因此完整的代码部分当前为:
app.get('/:language(' + content.languageSelector + ')/:page', pageHandle);
function pageHandle (req, res)
{
var language = req.params.language;
var thisPage = content.getPage(req.params.page, language);
if (thisPage)
{
// Disable caching for content files
res.header("Cache-Control", "no-cache, no-store, must-revalidate");
res.header("Pragma", "no-cache");
res.header("Expires", 0);
res.render(thisPage.file + '_' + language, {
thisPage : thisPage,
language: language,
languages: content.languages,
navigation: content.navigation,
footerNavigation: content.footerNavigation,
currentYear: new Date().getFullYear()
});
}
else
{
error404Handling(req, res);
}
}
发布于 2014-01-10 09:43:42
正如您所说,Safari会在重新加载时发送Cache-Control: max-age=0
。Express (或者更具体地说,Express的依赖项node-fresh)在接收到Cache-Control: no-cache
标头时会考虑缓存过期,但它不会对Cache-Control: max-age=0
执行同样的操作。据我所知,可能应该是这样的。但我不是缓存方面的专家。
修复方法是将node-fresh/index.js
的(当前)第37行从
if (cc && cc.indexOf('no-cache') !== -1) return false;
至
if (cc && (cc.indexOf('no-cache') !== -1 ||
cc.indexOf('max-age=0') !== -1)) return false;
我派生了node-fresh和express,通过npm
在我的项目的package.json
中包含这个修复,你也可以这样做。下面是我的for,例如:
https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix
safari-reload-fix分支基于3.4.7标记。
https://stackoverflow.com/questions/18811286
复制相似问题