为了提高网站的性能/响应能力,我使用 AJAX、replaceState、pushState 和 popstate 侦听器实现了部分页面加载。
我基本上将页面的中心部分(HTML)存储为历史记录中的状态对象。单击链接时,我仅从服务器请求页面的中心位(使用不同的 Accept 标头识别这些请求)并将其替换为 javascript。在 popstate 上,我抓住之前的中心部分并将其推回到 dom 中。
这基本上工作得很好,但是我发现了一个我陷入困境的特定问题。解释起来有点复杂,如果不是很清楚,我很抱歉。
我们的大多数页面上都有一个搜索表单。通过 ajax 进行的部分页面加载仅适用于 GET 请求,而表单执行 POST 会导致完整页面加载。
如果我导航以下一组页面,我最终会看到一个格式错误的部分页面,其中包含ONLY中心内容,没有任何周围的 dom:
从主页开始(通过整页加载)- 执行搜索(重定向后获取)
带您进入搜索结果(通过整页加载) - 然后单击“主页”
返回主页(通过动态获取) - 单击浏览器返回
搜索结果(来自 popstate 侦听器)- 单击浏览器后退
主页格式错误。
当出现格式错误的主页时,我的 popstate 侦听器根本不存在。
What I think发生的情况是,主页的第二次加载(动态、部分)被浏览器缓存,然后当发生完整页面返回时,浏览器仅显示缓存的部分响应而不是完整页面。
为了尝试解决此问题,我在响应中添加了 Vary: Accept 标头,让浏览器知道内容可能会根据接受标头而更改。我还向部分加载的内容添加了 Cache-Control max-age=0、pragma no-cache 和过去的到期日期,以尝试强制浏览器不缓存此内容,但这些都无法解决问题。
不幸的是,我的公司不允许外部流量到达我们的开发服务器,所以我无法向您展示问题。我在这里查看了各种类似的问题,但它们似乎都不完全相同,建议的解决方案似乎也不起作用。
如果我在动态 GET 请求中添加一个无意义的参数 (blah=blah),就可以解决问题。然而,这是一个丑陋的黑客,我宁愿不这样做。这似乎应该可以通过标头解决,因为我认为这是一个缓存问题。谁能解释一下发生了什么事吗?