NodeJS/express:缓存和304状态代码

h34*_*4cr 78 safari caching node.js http-status-code-304 express

当我重新加载使用express制作的网站时,我得到一个使用Safari(而不是Chrome)的空白页面,因为NodeJS服务器向我发送了304状态代码.

怎么解决这个?

当然,这也可能只是Safari的问题,但实际上它适用于所有其他网站,所以它也必须是我的NodeJS服务器上的问题.

要生成页面,我正在使用Jade res.render.

更新:似乎发生此问题是因为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…
}
Run Code Online (Sandbox Code Playgroud)

更新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);
    }
}
Run Code Online (Sandbox Code Playgroud)

ble*_*ted 82

最简单的解决方案

app.disable('etag');
Run Code Online (Sandbox Code Playgroud)

如果您想要更多控制,可以在此处替代解决方案:

http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/

  • 您能否解释“最简单的解决方案”或提供有关其影响的参考? (2认同)
  • @SamuelMéndez 它基本上禁用缓存,etag 上的 wiki 有很多很好的信息 https://en.wikipedia.org/wiki/HTTP_ETag (2认同)

sbu*_*ert 5

尝试在 Safari 中使用隐私浏览或删除整个缓存/cookie。

当浏览器认为其缓存中有该网站但实际上没有时,我在使用 Chrome 时遇到了一些类似的问题。

http 请求中使服务器响应 304 的部分是 etag。似乎 Safari 正在发送正确的 etag,但没有相应的缓存。