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');
더 많은 제어를 원하는 경우 여기에 대체 솔루션:
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
◦ ◦에서 읽는 것 을 얻고 .그렇게 함으로써 캐시에서 읽는 것이 아니라 새로운 응답을 얻고 싶었습니다.해결책은 페이지를 열심히 새로 고치는 것입니다.
"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
'IT' 카테고리의 다른 글
Linux 터미널의 클립보드에 파일 내용 복사 (0) | 2023.09.15 |
---|---|
ORA-02264: 기존 제약 조건에서 이미 사용된 이름 (0) | 2023.09.15 |
외국 열쇠는 어디에 보관해야 합니까? (0) | 2023.09.10 |
jQuery를 사용하여 클릭 시 앵커 텍스트/href를 가져오는 방법? (0) | 2023.09.10 |
각도 6 : http 통화 중 응답 유형을 텍스트로 설정하는 방법 (0) | 2023.09.10 |