Кнопка возврата HTML5 History API с частичной загрузкой страницы

Чтобы улучшить производительность / отзывчивость моего сайта, я реализовал частичную загрузку страницы, используя AJAX, replaceState, pushState и слушатель popstate.

По сути, я храню центральную часть моей страницы (HTML) как объект состояния в истории. Когда щелкают ссылку, я запрашиваю только центральный бит страницы с сервера (определяя эти запросы с помощью другого заголовка Accept) и заменяю его на javascript. На popstate я беру предыдущую центральную часть и толкаю ее обратно в дом.

Это в основном работает нормально, однако я нашел конкретную проблему, на которой я застрял. Это немного сложно объяснить, поэтому мои извинения, если это не очень ясно.

На большинстве наших страниц есть форма поиска. Частичная загрузка страницы через ajax происходит только по запросам GET, а форма выполняет POST, что приводит к полной загрузке страницы.

Если я перемещаюсь по следующему набору страниц, я оказываюсь на неправильно сформированной частичной странице, состоящей изONLY центральное содержание, без каких-либо окружающих дом:

Начать с домашней страницы (при полной загрузке страницы) - выполнить поиск (post-redirect-get)
Позволяет перейти к результатам поиска (при полной загрузке страницы) - затем нажмите «Главная».
Возвращает вас на главную страницу (через динамическое получение) - нажмите браузер обратно
Результаты поиска (от слушателя popstate) - нажмите браузер назад
Неверно сформированная домашняя страница.

Когда появляется искаженная домашняя страница, мой слушатель popstate вообще не присутствует.

Что яthink происходит то, что вторая загрузка (динамическая, частичная) домашней страницы кэшируется браузером, а затем, когда происходит полная страница назад, браузер просто показывает кэшированный частичный ответ, а не полную страницу.

Чтобы попытаться исправить это, я добавил в ответ заголовок Vary: Accept, чтобы браузеры знали, что содержимое может меняться в зависимости от заголовка accept. Я также добавил Cache-Control max-age = 0, pragma no-cache и дату окончания срока действия к частично загруженному контенту, чтобы заставить браузер не кэшировать это, но ничего из этого не решает.

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

Если я добавлю бессмысленный параметр (бла = бла) в мои динамические запросы GET, это решит проблему. Однако это уродливый хак, который я бы предпочел не делать. Похоже, что это должно быть решаемо с заголовками, так как я думаю, что это проблема кэширования. Кто-нибудь может объяснить, что происходит?

Ответы на вопрос(3)

Ваш ответ на вопрос