Quando recarrego um site feito com express, recebo uma página em branco com Safari (não com Chrome) porque o servidor NodeJS me envia um código de status 304.
Como resolver isso?
Claro, isso também pode ser apenas um problema do Safari, mas na verdade ele funciona bem em todos os outros sites, então deve ser um problema no meu servidor NodeJS também.
Para gerar as páginas, estou usando Jade com res.render
.
Atualização: parece que esse problema ocorre porque o Safari envia 'cache-control': 'max-age=0'
na recarga.
Atualização 2: agora tenho uma solução alternativa, mas existe uma solução melhor? Gambiarra:
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…
}
Atualização 3: Portanto, a parte completa do código é atualmente:
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);
}
}
Respostas:
Solução mais fácil:
app.disable('etag');
Solução alternativa aqui se você quiser mais controle:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
fonte
Como você disse, o Safari envia
Cache-Control: max-age=0
na hora de recarregar. Express (ou mais especificamente, a dependência de Express, node-fresh) considera o cache obsoleto quando osCache-Control: no-cache
cabeçalhos são recebidos, mas não faz o mesmo paraCache-Control: max-age=0
. Pelo que posso dizer, provavelmente deveria. Mas não sou um especialista em cache.A correção é a mudança (que é atualmente) linha 37 de
node-fresh/index.js
deif (cc && cc.indexOf('no-cache') !== -1) return false;
para
if (cc && (cc.indexOf('no-cache') !== -1 || cc.indexOf('max-age=0') !== -1)) return false;
Eu fiz um fork do node-fresh and express para incluir essa correção no meu projeto
package.json
vianpm
, você poderia fazer o mesmo. Aqui estão meus garfos, por exemplo:https://github.com/stratusdata/node-fresh https://github.com/stratusdata/express#safari-reload-fix
O branch safari-reload-fix é baseado na tag 3.4.7.
fonte
Tente usar a navegação privada no Safari ou deletar todo o seu cache / cookies.
Tive alguns problemas semelhantes ao usar o Chrome quando o navegador pensou que tinha o site em seu cache, mas na verdade não tinha.
A parte da solicitação http que faz o servidor responder 304 é o etag. Parece que o Safari está enviando a etag correta sem ter o cache correspondente.
fonte
Tive o mesmo problema no Safari e no Chrome (os únicos que testei), mas acabei de fazer algo que parece funcionar, pelo menos não consegui reproduzir o problema desde que adicionei a solução. O que fiz foi adicionar uma metatag ao cabeçalho com um carimbo de data / hora gerado. Não parece certo, mas é simples :)
<meta name="304workaround" content="2013-10-24 21:17:23">
Update PS Pelo que eu posso dizer, o problema desaparece quando eu removo meu proxy de nó (por proxy, quero dizer ambos express.vhost e módulo http-proxy), o que é estranho ...
fonte
Velha pergunta, eu sei. Desativar o recurso de cache não é necessário e não é a melhor maneira de gerenciar o problema. Ao desabilitar o recurso de cache, o servidor precisa trabalhar mais e gerar mais tráfego. Além disso, o navegador e o dispositivo precisam trabalhar mais, especialmente em dispositivos móveis, isso pode ser um problema.
A página vazia pode ser facilmente resolvida usando a tecla Shift + botão recarregar no navegador.
A página vazia pode ser o resultado de:
Experimente primeiro a tecla Shift do teclado + botão recarregar e veja se o problema ainda existe e reveja o seu código.
fonte