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

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

8 ответов

Самое простое решение:

app.disable('etag');

Альтернативное решение здесь, если вы хотите больше контроля:

http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/

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

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

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

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

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

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

Как вы сказали, Safari отправляет Cache-Control: max-age=0 при перезагрузке. Express (или, более конкретно, зависимость Express, свежая нода) учитывает устаревание кэша при получении Cache-Control: заголовки без кэширования, но он не делает то же самое для 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 основана на теге 3.4.7.

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

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

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

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

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

  • Операционная система: Windows
  • Браузер: Chrome

я использовал Ctrl + F5комбинация клавиш. Таким образом, вместо чтения из кеша я хотел получить новый ответ. Решение состоит в том, чтобы полностью обновить страницу.

В веб-документах MDN:

«Код ответа перенаправления клиента HTTP 304 Not Modified указывает, что нет необходимости повторно передавать запрошенные ресурсы. Это неявное перенаправление к кэшированному ресурсу».

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

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

app.use(force200Responses)

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

      // just add * in URL
    
app.get('/api*', (req, res)=>{

// do something 

});
Другие вопросы по тегам