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



当我重新加载一个用快递制作的网站时,我得到一个空白页,使用 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…
}

更新 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);
    }
}

最简单的解决方案:

app.disable('etag');

如果您想要更多控制,请使用此处的替代解决方案:

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

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

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

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

我在 Safari 和 Chrome(我测试过的唯一一个)中遇到了同样的问题,但我只是做了一些似乎有效的事情,至少自从我添加解决方案以来我无法重现这个问题。我所做的是用生成的 timstamp 向标题添加一个元标记。似乎不对,但这很简单:)

<meta name="304workaround" content="2013-10-24 21:17:23">

更新附言据我所知,当我删除我的节点代理时,问题消失了(代理是指 express.vhost 和 http-proxy 模块),这很奇怪......

正如你所说,Safari 会在重新加载时发送Cache-Control: max-age=0。Express(或者更具体地说,Express的依赖项,节点新鲜)在收到Cache-Control: no-cache标头时认为缓存过时,但它对Cache-Control: max-age=0不这样做。据我所知,它可能应该。但我不是缓存方面的专家。

解决方法是将(当前)第 37 行的 node-fresh/index.js

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中,您可以这样做。例如,这是我的分叉:

https://github.com/stratusdata/node-freshhttps://github.com/stratusdata/express#safari-reload-fix

safari-reload-fix 分支基于 3.4.7 标签。

老问题,我知道。禁用缓存工具不是必需的,这不是管理问题的最佳方法。通过禁用缓存功能,服务器需要更加努力地工作并产生更多流量。此外,浏览器和设备需要更加努力地工作,尤其是在移动设备上,这可能是一个问题。

空白页面可以通过在浏览器中使用Shift键+重新加载按钮轻松解决。

空页面可能是由于以下原因造成的:

  • 代码中的错误
  • 在测试时,您提供了一个空页面(你不能记住)由浏览器缓存
  • Safari 中的一个错误(如果是这样,请向Apple报告,不要尝试自己修复它)

首先尝试 Shift 键盘键 + 重新加载按钮,看看问题是否仍然存在,然后查看您的代码。

  • 操作系统:Windows
  • 浏览器: Chrome

我使用了Ctrl + F5键盘组合。通过这样做,我希望获得新的响应,而不是从缓存中读取。解决方案是硬刷新页面。

在 MDN Web Docs 上:

"HTTP 304 未修改客户端重定向响应代码指示无需重新传输请求的资源。这是一个隐式重定向到缓存的资源。

// just add * in URL
    
app.get('/api*', (req, res)=>{
// do something 
});

相关内容

  • 没有找到相关文章

最新更新