我们的一些链接由PJAX包装。当用户单击PJAX链接时,服务器仅返回HTML的必需部分。
如果我执行以下操作:
浏览器将显示PJAX请求返回的内容。 HTML将被破坏,因为它只是要显示的HTML的一部分(检查this question)。
我们试图通过不缓存PJAX响应(Cache-Control
标头)来解决这个问题。这解决了我们的问题,但提出了另一个:
当用户按下后退按钮时,WebKit(Chrome 20.0)会从服务器加载完整内容,然后触发导致不必要的PJAX请求的popstate
事件。
是否可以重新创建正确的后退按钮行为?
答案 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