PJAX: проблемы с кнопкой Назад

некоторые наши ссылки обернуты PJAX. Когда пользователь нажимает на ссылку PJAX, сервер возвращает только требуемую часть HTML.

Если я сделаю следующее:

  1. нажмите pjax link
  2. Нажмите кнопку простая ссылка
  3. Нажмите кнопку Назад

браузер отобразит содержимое, возвращенное запросом PJAX. HTML будет нарушен, потому что это только часть HTML, который будет отображаться (проверьте этот вопрос).

мы попытались исправить это, не кэшируя ответы PJAX (). Это исправило нашу проблему, но подняло другую.: Когда пользователь нажимает кнопку "Назад", WebKit (Chrome 20.0) загружает полный контент с сервера, а затем запускает popstate событие, которое вызывает ненужный запрос PJAX.

можно ли воссоздать правильное поведение кнопки "Назад"?

2 ответов


все это зависит от настроек кэширования сервера. Браузер кэширует ответ AJAX с сервера, и при нажатии кнопки "назад" он использует кэшированную версию.

чтобы предотвратить кэширование, установите следующие заголовки на сервере:

'Cache-Control' => 'no-cache, no-store, max-age=0, must-revalidate'
'Pragma' => 'no-cache'

Если вы используете Rails, то обязательно попробуйте Wiselinks https://github.com/igor-alexandrov/wiselinks. Это швейцарский армейский нож для управления государством. Вот некоторые подробности: http://igor-alexandrov.github.io/blog/2013/07/11/the-way-to-wiselinks-1-dot-0/.


чтобы браузер знал о различных версиях ресурсов HTTP в зависимости от заголовков запросов, я добавил Вар заголовок http.

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

в PHP это будет выглядеть так:

header("Vary: X-PJAX");

Так как мы иногда используем 3 представления на URL (обычный http, pjax и ajax) - потому что миграция на подход PJAX в уже иногда ajaxified приложение - мы на самом деле использовать:

header("Vary: X-PJAX,X-Requested-With");

Если вам нужно поддерживать старые версии IE (старше IE9), вам нужно убедиться, что заголовок Vary удален вашим веб-сервером, потому что otherweise old IE отключит кэширование для всех ваших ресурсов, которые предоставляют заголовок Vary.

Это может быть достигнуто с помощью следующей настройки в вашем .конфигурация htaccess/vhost:

BrowserMatch "MSIE" force-no-vary

изменить: Базовых баг хрома , https://code.google.com/p/chromium/issues/detail?id=94369