Chrome показывает кэшированный JSON после перехода на новую страницу и нажатия кнопки «назад», используя Ruby в Rails в качестве бэкэнда - PullRequest
1 голос
/ 06 февраля 2020

Проблема :

После выхода со страницы, которая использует pushState и popState для обработки навигации назад и вперед при получении HTML и JSON с того же базового URL, возвращаясь к страница, использующая кнопку «Назад», показывает кэшированный JSON вместо HTML.

Описание :

  1. Использование Ajax вызовов для поиска по странице при поиске В результате наше приложение использует тот же URL-адрес, что и URL-адрес страницы, но с форматом = json.
  2. На каждой странице вызывается window.history.pushState(state,null,url).
  3. popState используется внутренне, когда задний и На этой странице используются кнопки вперед.
  4. Результаты содержат ссылки, которые загружают другие страницы. (Это приложение не SPA)
  5. После нажатия на одну из этих ссылок и нажатия кнопки «Назад», Chrome показывает JSON, сохраненный в состоянии, а не предыдущую страницу с консолью ошибка:

Ресурс интерпретируется как Документ, но передается с приложением MIME-типа / json

Firefox и Safari корректно перезагружает страницу, и так как я обновляя URL в вызове pushState, они корректно перезагружают страницу в состояние I sh (т. е. URL имеет правильную идентификацию страницы и, следовательно, перезагружает правильную страницу результатов поиска).

1 Ответ

0 голосов
/ 07 февраля 2020

Похоже, что ответ отключил кэширование JSON или убедил Chrome, что кэшированный JSON не то, что нужно. Основываясь на ответе другого вопроса, я добавил response.headers['Vary'] = 'Accept' в контроллер rails при возврате JSON.

Итак, в контексте:

respond_to do |format|
  format.html do 
    render :template => xxx
  end
  format.json do
    response.headers['Vary'] = 'Accept'
    render :json => {...}
  end
end

Вопросы, которые мне помогли:

...