22

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

如果我执行以下操作:

  1. 点击 PJAX 链接
  2. 点击简单链接
  3. 按下返回按钮

浏览器将显示 PJAX 请求返回的内容。HTML 将被破坏,因为它只是要显示的 HTML 的一部分(检查这个问题)。

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

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

4

2 回答 2

4

为了让浏览器根据请求标头了解不同版本的 HTTP 资源,我添加了一个Vary http 标头。

使用 Vary,您不再需要发送无缓存标头,从而再次快速获取您的页面。

在 PHP 中,这看起来像:

header("Vary: X-PJAX");

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

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

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

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

BrowserMatch "MSIE" force-no-vary

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

于 2014-04-08T10:00:17.930 回答
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/

于 2013-07-12T05:51:37.277 回答