为什么缓存ajax请求不起作用?

时间:2012-12-04 16:38:17

标签: ajax caching prototypejs

我有一个大的json数据对象(超过300K未压缩,40K gzip),它在我的内部系统的每个页面上使用。我想每15分钟取一次。在这段时间内,用户可能会访问我系统的数十页。

Firebug中的HTTP响应标头如下所示:

Cache-Control   max-age=899, public
Connection  Keep-Alive
Content-Encoding    gzip
Content-Length  44017
Content-Type    text/html; charset=iso-8859-2
Date    Tue, 04 Dec 2012 16:21:45 GMT
Expires Tue, 04 Dec 12 17:36:45 +0100
Keep-Alive  timeout=15, max=99
Last-Modified   Tue, 04 Dec 12 17:21:45 +0100
Pragma  no-cache
Server  Apache
Set-Cookie  user_auth=xxx; expires=Wed, 12-Dec-2012 16:21:45 GMT; path=/; domain=example.com 
Vary    Accept-Encoding
X-Genaration-Time   0.13282179832458 sec.
X-Genarator vCRM 3.1 (c) Veracomp S.A.
X-Powered-By    PHP/5.3.3-7+squeeze14

将来,缓存标头设置为15分钟,但Chrome和Firefox都无法缓存它。 Firebug说这是关于缓存:

Data Size   44017
Device  disk
Expires Thu Jan 01 1970 01:00:00 GMT+0100
Fetch Count 5
Last Fetched    Tue Dec 04 2012 17:21:45 GMT+0100
Last Modified   Tue Dec 04 2012 17:21:45 GMT+0100

忽略了Expires标题,但为什么?

这不太重要,但我最好写一下,内容类型是text / html,所以服务器可以gzip,但实际上内容是JSON。

我正在使用Prototype.js来请求它。我设置了请求标头:

Cache-control: max-age=900

Prototype.js不会向url添加任何缓存buster参数。 我正在使用PHP和Zend_Framework来设置响应。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题解决了。

正如@Victor指出的那样,我设置了“Pragma:no-cache”标头。标题是由PHP设置的。我和我们的网络服务器管理员一起工作,我们设法用Apache取消了标题 还是不够。我们的框架在每次页面刷新时都设置了cookie,我无法将其转换为。浏览器不想缓存设置cookie的请求。我们不得不取消设置Set-Cookie标头。 最后,这两个unsets允许我们启用缓存:

<LocationMatch "(?i)/url/we/want/to/be/cached/.+">
       Header unset Pragma
       Header unset Set-Cookie
</LocationMatch>