NodeJS/express:缓存和304状态码

浏览 81关注 0回答 7得票数 102
原文

当我重新加载一个用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);
    }
}
原文
h345k34cr修改于2013-09-18 22:26

7 个回答

高票数最新
sbugert
回答于2013-09-16 04:07
得票数 3

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

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

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

user907567
修改于2013-10-25 03:37
得票数 3

我在Safari和Chrome (我测试过的唯一的浏览器)中也遇到了同样的问题,但我只是做了一些似乎可以工作的事情,至少自从我添加了解决方案后,我还没有能够重现这个问题。我所做的就是使用生成的时间戳将元标记添加到标头中。看起来不太对,但很简单:)

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

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

J. Scott Elblein
修改于2019-09-20 04:42
得票数 3

正如您所说,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标记。

blented
修改于2014-05-17 08:04
得票数 118

最简单的解决方案:

app.disable('etag');

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

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

Codebeat
回答于2018-09-10 20:55
得票数 1

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

在浏览器中使用Shift key+reload按钮可以轻松地解决空白页面的问题。

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

  • a bug in your code
  • 测试时,您提供了一个由浏览器缓存的空页面(您已经记不住了)
  • Safari中的一个错误(如果是,请报告给苹果,不要尝试自己修复)

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

Hasan Gökçe
回答于2021-01-11 23:22
得票数 0

Windows

  • Browser:Chrome

  • 操作系统

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

MDN Web Docs

“HTTP304未修改的客户端重定向响应码表明不需要重新传输请求的资源。它是到缓存资源的隐式重定向。”

Slava Rozhnev
修改于2021-07-04 20:15
得票数 -2
// just add * in URL
    
app.get('/api*', (req, res)=>{

// do something 

});
页面原文内容由h345k34cr、sbugert、Yuttanant Suwansiri、user907567、James P. Javery、J. Scott Elblein、Clafou、blented、Samuel Méndez、Naveen Kumar V、Robert Patterson、Codebeat、Hasan Gökçe、Harshit Srivastv、Slava Rozhnev提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:https://stackoverflow.com/questions/18811286复制

扫码关注腾讯云开发者

领取腾讯云代金券