Ответ 1
Самое простое решение:
app.disable('etag');
Альтернативное решение здесь, если вы хотите большего контроля:
Когда я перезагружаю веб-сайт, созданный с помощью экспресс-доставки, я получаю пустую страницу с Safari (не с Chrome), потому что сервер NodeJS отправляет мне код статуса 304.
Как это решить?
Конечно, это также может быть просто проблемой Safari, но на самом деле он работает на всех других сайтах отлично, поэтому это тоже проблема на моем сервере NodeJS.
Чтобы сгенерировать страницы, я использую Jade с 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, обновление узла) учитывает устаревание кэша при получении заголовков 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.
У меня была такая же проблема в Safari и Chrome (только те, которые я тестировал), но я просто сделал что-то, что, похоже, работает, по крайней мере, я не смог воспроизвести проблему, так как я добавил решение. То, что я сделал, это добавить метатег в заголовок с генерируемой отметкой времени. Не кажется правильным, но это просто:)
<meta name="304workaround" content="2013-10-24 21:17:23">
Обновление P.S Насколько я могу судить, проблема исчезает, когда я удаляю прокси-сервер node (по прокси, я имею в виду как express.vhost, так и http-proxy module), что странно...
Попробуйте использовать приватный просмотр в Safari или удалите весь кеш/файлы cookie.
У меня были некоторые подобные проблемы с использованием хром, когда браузер думал, что у него есть веб-сайт в кеше, но на самом деле его не было.
Часть HTTP-запроса, которая заставляет сервер реагировать на 304, - это. Похоже, что Safari отправляет правильный etag без соответствующего кеша.
Старый вопрос, я знаю. Отключение функции кэширования не требуется и не является лучшим способом решения проблемы. Отключая функцию кэширования, сервер должен работать больше и генерировать больше трафика. Кроме того, браузер и устройство должны работать больше, особенно на мобильных устройствах, это может быть проблемой.
Пустая страница может быть легко решена с помощью клавиши Shift + перезагрузка в браузере.
Пустая страница может быть результатом:
Сначала попробуйте нажать клавишу Shift + кнопку перезагрузки и посмотрите, сохраняется ли проблема, и просмотрите ваш код.
Это... Это самый простой способ...
function force200Responses(req, res, next) { req.headers['if-none-match'] = 'no-match-for-this'; next(); }
app.use(force200Responses)
Будущее меня, пожалуйста.