Chrome 在导航到新页面并使用 Rails 上的 Ruby 作为后端点击后退按钮后显示缓存 JSON

Chrome showing cached JSON after navigating to new page and hitting back button using Ruby on Rails as backend

问题:

在离开使用 pushState 和 popState 处理后退和前进导航的页面后,从相同的基础 URL 检索 HTML 和 JSON,返回到使用后退的页面按钮显示缓存的 JSON 而不是 HTML.

描述:

  1. 在我们的应用程序中使用 Ajax 调用通过搜索结果分页,使用与页面 URL 相同的 URL,但格式 =json.
  2. 在每个页面上调用 window.history.pushState(state,null,url)
  3. 当在此页面中使用后退和前进按钮时,在内部使用 popState。
  4. 结果包含加载其他页面的链接。 (此应用程序不是 SPA)
  5. 点击其中一个链接,然后点击 'Back' 按钮后,Chrome 显示 JSON 存储在状态中,而不是前一个控制台错误的页面:

Resource interpreted as Document but transferred with MIME type application/json

Firefox 和 Safari 正确地重新加载了页面,并且由于我正在更新 pushState 调用中的 URL,它们正确地将页面重新加载到我希望的状态(即 url 具有正确的页面标识因此,重新加载搜索结果的正确页面)。

看起来答案是关闭 JSON 的缓存或说服 Chrome 缓存的 JSON 不是我们想要的。根据另一个问题的答案,我在返回 JSON.

时在 rails 控制器中添加了 response.headers['Vary'] = 'Accept'

因此,在上下文中:

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

对我有帮助的问题: