IT TIP

NodeJS / express : 캐시 및 304 상태 코드

itqueen 2020. 10. 12. 21:18
반응형

NodeJS / express : 캐시 및 304 상태 코드


Express로 만든 웹 사이트를 다시로드하면 NodeJS 서버가 304 상태 코드를 보내므로 Safari (Chrome이 아님)에서 빈 페이지가 나타납니다.

이것을 해결하는 방법?

물론 이것은 Safari의 문제 일 수도 있지만 실제로는 다른 모든 웹 사이트에서 잘 작동하므로 NodeJS 서버에서도 문제가 될 것입니다.

페이지를 생성하기 위해 저는 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는 Cache-Control: max-age=0다시로드 할 때 전송 합니다. Express (또는 더 구체적으로 Express의 종속성, node-fresh)는 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;

나는 노드 신선한 포크와 내 프로젝트의에서이 수정을 포함하는 표현 package.json을 통해이 npm, 당신은 동일한 기능을 수행 할 수 있습니다. 예를 들어 다음은 내 포크입니다.

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

safari-reload-fix 분기는 3.4.7 태그를 기반으로합니다.


I had the same problem in Safari and Chrome (the only ones I've tested) but I just did something that seems to work, at least I haven't been able to reproduce the problem since I added the solution. What I did was add a metatag to the header with a generated timstamp. Doesn't seem right but it's simple :)

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

Update P.S As far as I can tell, the problem disappears when I remove my node proxy (by proxy i mean both express.vhost and http-proxy module), which is weird...


Try using private browsing in Safari or deleting your entire cache/cookies.

I've had some similar issues using chrome when the browser thought it had the website in its cache but actually had not.

The part of the http request that makes the server respond a 304 is the etag. Seems like Safari is sending the right etag without having the corresponding cache.


Old question, I know. Disabling the cache facility is not needed and not the best way to manage the problem. By disabling the cache facility the server needs to work harder and generates more traffic. Also the browser and device needs to work harder, especially on mobile devices this could be a problem.

The empty page can be easily solved by using Shift key+reload button at the browser.

The empty page can be a result of:

  • a bug in your code
  • while testing you served an empty page (you can't remember) that is cached by the browser
  • a bug in Safari (if so, please report it to Apple and don't try to fix it yourself)

Try first the Shift keyboard key + reload button and see if the problem still exists and review your code.

참고URL : https://stackoverflow.com/questions/18811286/nodejs-express-cache-and-304-status-code

반응형