我们的一些链接是用PJAX包装的。当用户单击PJAX链接时,服务器只返回HTML的必需部分。
如果我执行以下操作:
- 单击PJAX链接
- 单击简单链接
- 按下后退按钮
浏览器将显示PJAX请求返回的内容。HTML将被破坏,因为它只是要显示的HTML的一部分(勾选此问题)。
我们已尝试通过不缓存PJAX响应(Cache-Control
标头)来解决此问题。这解决了我们的问题,但引发了另一个问题:当用户按下后退按钮时,WebKit(Chrome 20.0)从服务器加载完整内容,然后触发popstate
事件,导致不必要的PJAX请求。
是否可以重新创建正确的后退按钮行为?
为了让浏览器了解HTTP资源的不同版本(取决于请求标头),我添加了VaryHTTP标头。
使用Vary,您不需要再发送任何缓存标头,因此可以再次快速获取页面。
在PHP中,这看起来像:
header("Vary: X-PJAX");
由于我们有时会为每个URL使用3种表示形式(常规http、pjax和ajax)——因为在一个已经有时被精简的应用程序中迁移到pjax方法——我们实际上使用:
header("Vary: X-PJAX,X-Requested-With");
如果你需要支持旧的IE(比IE9旧)版本,你需要确保你的Web服务器剥离了Vary标头,因为其他旧的IE会禁用所有提供Vary标头的资源的缓存。
这可以通过.htaccess/vhost-config:中的以下设置来实现
BrowserMatch "MSIE" force-no-vary
编辑:潜在的chrome bug,https://code.google.com/p/chromium/issues/detail?id=94369
这一切都取决于服务器缓存设置。浏览器缓存来自服务器的AJAX响应,当单击"上一步"按钮时,它将使用缓存的版本。
要防止缓存,请在服务器上设置以下标头:
'Cache-Control' => 'no-cache, no-store, max-age=0, must-revalidate'
'Pragma' => 'no-cache'
如果你正在使用Rails,那么一定要试试Wiselinkshttps://github.com/igor-alexandrov/wiselinks.这是一把瑞士军刀,用于浏览器状态管理。以下是一些详细信息:http://igor-alexandrov.github.io/blog/2013/07/11/the-way-to-wiselinks-1-dot-0/.