PJAX:后退按钮问题

时间:2012-07-26 06:47:33

标签: webkit browser-history pjax popstate

我们的一些链接由PJAX包装。当用户单击PJAX链接时,服务器仅返回HTML的必需部分。

如果我执行以下操作:

  1. 点击PJAX链接
  2. 点击简单链接
  3. 按后退按钮
  4. 浏览器将显示PJAX请求返回的内容。 HTML将被破坏,因为它只是要显示的HTML的一部分(检查this question)。

    我们试图通过不缓存PJAX响应(Cache-Control标头)来解决这个问题。这解决了我们的问题,但提出了另一个: 当用户按下后退按钮时,WebKit(Chrome 20.0)会从服务器加载完整内容,然后触发导致不必要的PJAX请求的popstate事件。

    是否可以重新创建正确的后退按钮行为?

2 个答案:

答案 0 :(得分:3)

这一切都取决于服务器缓存设置。您浏览器从服务器缓存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/

答案 1 :(得分:3)

为了让浏览器了解不同版本的HTTP资源,具体取决于请求标头,我添加了 Vary http标头。

使用Vary,您不再需要发送no-cache标头,因此可以让您的页面再次快速。

在PHP中,这看起来像:

header("Vary: X-PJAX");

由于我们有时会为每个URL使用3个表示形式(常规http,pjax和ajax) - 因为在一个已经有时被ajaxified的应用程序中迁移到PJAX方法 - 我们实际上使用:

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

如果您需要支持旧的IE(早于IE9)版本,您需要确保您的网络服务器剥离了Vary标头,因为其他旧的IE将禁用所有提供Vary标头的资源的缓存。 / p>

这可以通过.htaccess / vhost配置中的以下设置来实现:

BrowserMatch "MSIE" force-no-vary

编辑: 底层铬虫,https://code.google.com/p/chromium/issues/detail?id=94369