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