Подтвердить что ты не робот

NodeJS/express: код состояния кэша и 304

Когда я перезагружаю веб-сайт, созданный с помощью экспресс-доставки, я получаю пустую страницу с 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);
    }
}
4b9b3361

Ответ 2

Как вы сказали, 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.

Ответ 3

У меня была такая же проблема в Safari и Chrome (только те, которые я тестировал), но я просто сделал что-то, что, похоже, работает, по крайней мере, я не смог воспроизвести проблему, так как я добавил решение. То, что я сделал, это добавить метатег в заголовок с генерируемой отметкой времени. Не кажется правильным, но это просто:)

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

Обновление P.S Насколько я могу судить, проблема исчезает, когда я удаляю прокси-сервер node (по прокси, я имею в виду как express.vhost, так и http-proxy module), что странно...

Ответ 4

Попробуйте использовать приватный просмотр в Safari или удалите весь кеш/файлы cookie.

У меня были некоторые подобные проблемы с использованием хром, когда браузер думал, что у него есть веб-сайт в кеше, но на самом деле его не было.

Часть HTTP-запроса, которая заставляет сервер реагировать на 304, - это. Похоже, что Safari отправляет правильный etag без соответствующего кеша.

Ответ 5

Старый вопрос, я знаю. Отключение функции кэширования не требуется и не является лучшим способом решения проблемы. Отключая функцию кэширования, сервер должен работать больше и генерировать больше трафика. Кроме того, браузер и устройство должны работать больше, особенно на мобильных устройствах, это может быть проблемой.

Пустая страница может быть легко решена с помощью клавиши Shift + перезагрузка в браузере.

Пустая страница может быть результатом:

  • ошибка в вашем коде
  • во время тестирования вы обслуживали пустую страницу (которую вы не помните), которая кэшируется браузером
  • ошибка в Safari (если так, пожалуйста, сообщите об этом в Apple и не пытайтесь исправить это самостоятельно)

Сначала попробуйте нажать клавишу Shift + кнопку перезагрузки и посмотрите, сохраняется ли проблема, и просмотрите ваш код.

Ответ 6

Это... Это самый простой способ...

function force200Responses(req, res, next) { req.headers['if-none-match'] = 'no-match-for-this'; next(); }

app.use(force200Responses)

Будущее меня, пожалуйста.