如何在GAE中启用浏览器缓存

时间:2013-01-10 19:57:54

标签: google-app-engine

虽然这个问题应该是微不足道的,但我没有成功在web google app engine java server上启用浏览器缓存。

我试着把这种东西放在我的appengine-web.xml中:

<static-files>
  <include path="/**.cache.**" expiration="365d" />
...

但是当我查看响应头时,我在本地发现了这个:

Content-Length: 196084
Cache-Control: public, max-age=31536000
Expires: Fri, 10 Jan 2014 19:40:45 GMT
Content-Type: image/png
Last-Modified: Tue, 18 Dec 2012 21:41:22 GMT
Server: Jetty(6.1.x)

哪个好......但是在生产环境中这个:

HTTP/1.1 304 Not Modified
ETag: "RV4Bpg"
X-AppEngine-Estimated-CPM-US-Dollars: $0.000000
X-AppEngine-Resource-Usage: ms=109 cpu_ms=0
Date: Thu, 10 Jan 2013 19:41:20 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, must-revalidate
Server: Google Frontend

这绝对不是我想要的:(

有什么想法吗?我错过了什么?

[编辑] 对于尚未下载的内容,我的浏览器会收到以下标题:

HTTP/1.1 200 OK
ETag: "RV4Bpg"
Date: Fri, 11 Jan 2013 12:50:50 GMT
Expires: Sat, 11 Jan 2014 12:50:50 GMT
Cache-Control: public, max-age=31536000
X-AppEngine-Estimated-CPM-US-Dollars: $0.000000
X-AppEngine-Resource-Usage: ms=3 cpu_ms=0
Date: Fri, 11 Jan 2013 12:50:50 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, must-revalidate
Content-Type: image/png
Server: Google Frontend
Content-Length: 196084
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
X-RBT-Optimized-By: eu-dcc-sh02 (RiOS 6.5.5b) SC

ETag和几个相互矛盾的'Expires'和'Cache-Control'...... 有几种方法可以配置缓存策略?它可以来自我的ISP吗?还是代理?

2 个答案:

答案 0 :(得分:9)

以管理员身份登录Google App Engine应用程序时:

  1. 包含问题中显示的X-AppEngine-*标题。
  2. 包含Cache-Control: no-cache, must-revalidate标头,因为X-AppEngine-*标头是私有的,不得缓存。
  3. 这隐藏在https://developers.google.com/appengine/docs/python/runtime#Responses的“回复”部分的末尾,其中包含:

      

    资源使用情况统计信息的响应将无法缓存。

答案 1 :(得分:2)

是的,Cache-Control已关闭,因为回复是HTTP 304。

问题是您的浏览器保存了ETag:http://en.wikipedia.org/wiki/HTTP_ETag

现在,对于相同网址/内容的每个请求,浏览器都会使用HTTP 304 Not Modified提供ETag和GAE回复。

尝试更改此网址上的资源(图片),检查您尚未在此浏览器中加载的其他网址或完全使用其他浏览器或计算机。

此外,这也很重要:What takes precedence: the ETag or Last-Modified HTTP header?