NodeJS / express:caching和304状态码
当我重新加载一个使用express的网站时,由于NodeJS服务器向我发送了一个304状态码,所以我用Safari(而不是Chrome)得到了一个空白页面。
如何解决这个问题?
当然,这也可能只是Safari的一个问题,但实际上它在所有其他网站上都可以正常工作,所以在我的NodeJS服务器上也是一个问题。
为了生成页面,我使用了res.render
Jade。
更新:看起来像这样的问题发生,因为Safari发送'cache-control': 'max-age=0'
重新加载。
更新2:我现在有一个解决方法,但有没有更好的解决scheme? 解决方法:
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); } }
最简单的解决scheme
app.disable('etag');
如果您想要更多控制,可以在这里select其他解
如您所说,Safari在重新加载时发送Cache-Control:max-age = 0。 当Cache-Control:no-cache头被接收时,Express(或者更具体地说,Express的依赖性,节点新鲜)认为caching失效,但是对于Cache-Control:max-age = 0,它不会这样做。 从我可以告诉,它可能应该。 但我不是caching方面的专家。
解决的办法是将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;
我分叉节点新鲜和明确,通过npm
在我的项目的package.json中包括此修复npm
,你可以做同样的事情。 这是我的叉子,例如:
https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix
safari-reload-fix分支是基于3.4.7标签的。
我在Safari和Chrome(我testing过的唯一一个)中遇到了同样的问题,但是我只是做了一些似乎能够工作的东西,至less自从我添加了解决scheme后,我一直无法重现这个问题。 我所做的是添加一个元标记与生成的timstamp标题。 似乎不正确,但很简单:)
<meta name="304workaround" content="2013-10-24 21:17:23">
更新 PS据我所知,当我删除我的节点代理(代理我的意思是express.vhost和HTTP代理模块),这是奇怪的问题消失…
尝试在Safari中使用隐私浏览或删除整个caching/ Cookie。
当浏览器认为它的caching中有网站但实际上没有。
使服务器响应304的http请求的部分是etag。 似乎Safari正在发送正确的etag,而没有相应的caching。