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

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

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

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

  • Нажмите ссылку PJAX
  • Нажмите простую ссылку
  • Нажмите кнопку возврата

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

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

Возможно ли воссоздать правильное поведение кнопки обратной связи?

4b9b3361

Ответ 1

Все зависит от настроек кеширования сервера. Ваш браузер кэширует ответ 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/.

Ответ 2

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

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

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

header("Vary: X-PJAX");

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

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

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

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

BrowserMatch "MSIE" force-no-vary

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