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');
더 많은 제어가 필요한 경우 여기에 대체 솔루션 :
말했듯이 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
'IT TIP' 카테고리의 다른 글
R에서 Excel로 쓸 때 java.lang.OutOfMemoryError 처리 (0) | 2020.10.12 |
---|---|
Android가 더 많은 열거 형을 사용하지 않는 이유는 무엇입니까? (0) | 2020.10.12 |
명령 줄 HTML 프리티 프린터 : 복잡한 HTML을 읽기 쉽게 만들기 (0) | 2020.10.12 |
Windows 용 Systrace (0) | 2020.10.12 |
정적 메서드 상속에 대한 올바른 대안은 무엇입니까? (0) | 2020.10.12 |