IT

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

itgroup 2023. 9. 10. 12:11
반응형

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

express로 만든 웹 사이트를 다시 로드하면 노드 때문에 Safari(Chrome이 아닌)가 빈 페이지로 나타납니다.JS 서버에서 304 상태 코드를 보내 줍니다.

어떻게 해결해야 할까요?

물론 이것도 사파리의 문제일 수 있지만, 실제로는 다른 모든 웹사이트에서 잘 작동하기 때문에 내 노드에서 문제가 될 수 밖에 없습니다.JS서버도.

페이지를 생성하기 위해 제이드를 사용하고 있습니다.res.render.

업데이트: 사파리에서 전송하기 때문에 이 문제가 발생하는 것 같습니다.'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에서 개인 브라우징을 사용하거나 전체 캐시/쿠키를 삭제해 보십시오.

브라우저가 캐시에 웹사이트가 있다고 생각했지만 실제로는 그렇지 않았을 때 크롬을 사용하는 것과 비슷한 문제가 있었습니다.

http 요청에서 서버가 304를 응답하게 만드는 부분은 etag입니다.사파리가 해당 캐시 없이 올바른 태그를 보내는 것 같습니다.

사파리와 크롬(테스트한 유일한 제품)에서도 동일한 문제가 발생했지만 효과가 있는 것처럼 보이는 작업을 했을 뿐이며, 적어도 솔루션을 추가한 이후에는 문제를 재현할 수 없었습니다.생성된 타임스탬프로 메타태그를 헤더에 추가했습니다.아닌 것 같지만 간단합니다 :)

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

업데이트 P.S 내가 알 수 있는 한, 노드 프록시를 제거하면 문제가 사라집니다(프록시는 둘 다 express를 의미합니다).vhost 및 http-http-http-http-http module),

말씀하신 것처럼 사파리는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;

노드-프레시(node-fresh)를 변경했고 프로젝트에 이 수정 사항을 포함할 것을 명시했습니다.package.json경유로npm, 당신도 그렇게 할 수 있습니다.예를 들어 제 포크는 다음과 같습니다.

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

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

오래된 질문이군요, 알아요캐시 기능을 비활성화하는 것은 필요하지 않으며 문제를 관리하는 최선의 방법도 아닙니다.캐시 기능을 비활성화함으로써 서버는 더 많은 작업을 수행하고 더 많은 트래픽을 생성해야 합니다.또한 브라우저와 장치는 특히 모바일 장치에서 더 열심히 작동해야 합니다. 이것은 문제가 될 수 있습니다.

빈 페이지는 브라우저에서 Shift key+reload 버튼을 사용하여 쉽게 해결할 수 있습니다.

빈 페이지의 결과는 다음과 같습니다.

  • 자네 암호의 오류
  • 브라우저에서 캐시된 빈 페이지(기억할 수 없음)를 제공한 경우
  • 사파리의 버그 (만약 그렇다면 애플에 보고하고 직접 고치려고 하지 마세요)

먼저 Shift keyboard + reload 버튼을 사용하여 문제가 여전히 존재하는지 확인하고 코드를 검토합니다.

  • 체제: :Windows
  • :Chrome

사용했습니다.Ctrl + F5◦ ◦에서 읽는 것 을 얻고 .그렇게 함으로써 캐시에서 읽는 것이 아니라 새로운 응답을 얻고 싶었습니다.해결책은 페이지를 열심히 새로 고치는 것입니다.

MDN문서의 경우:

"HTTP 304 Not Modified 클라이언트 리디렉션 응답 코드는 요청된 리소스를 재전송할 필요가 없음을 나타냅니다.캐시된 리소스로 암묵적으로 리디렉션되는 것입니다."

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

// do something 

});

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

반응형