1

我有一个大型 json 数据对象(超过 300K 未压缩,40K gzipped),用于我内部系统的每个页面。我想每 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 添加任何缓存破坏器参数。我正在使用带有 Zend_Framework 的 PHP 来设置响应响应。

我究竟做错了什么?

4

1 回答 1

1

问题解决了。

正如@Victor 指出的那样,我设置了“Pragma:no-cache”标头。标头是由 PHP 以某种方式设置的。我与我们的网络服务器管理员一起工作,我们设法使用 Apache 取消设置标头。
仍然不够。我们的框架会在每次页面刷新时设置 cookie,但我无法关闭它。浏览器不想缓存设置 cookie 的请求。我们也必须取消设置 Set-Cookie 标头。最后,这两个未设置允许我们启用缓存:

<LocationMatch "(?i)/url/we/want/to/be/cached/.+">
       Header unset Pragma
       Header unset Set-Cookie
</LocationMatch>
于 2012-12-11T16:26:40.557 回答