google-app-engine - 为什么 chrome 不缓存 google app engine blobstore

标签 google-app-engine http browser-cache blobstore

我正在使用 blobstore 提供嵌入在 HTML5 音频元素中的音频文件。因为我有一个 blobkey 作为 url 的一部分,所以我可以假设对于任何给定的 url,其内容永远不会改变。这看起来像是一个完美的缓存设置。

昨天我实现了一个似乎有效的解决方案。至少我记得它有效;)。不幸的是,今天我发现它不适用于 Chrome 和生产服务器。它与 Internet Explorer 和 Firefox 完美配合。它甚至可以与 Chrome 和开发服务器一起使用——我使用的是 1.7.6 版。我的解决方案使用 Cache-Control header ,但似乎只有 Firefox 使用它。此外,我添加了一个 ETag header 。当我发现具有相同值的 If-None-Match 请求 header 时,我返回 304 代码。这似乎适用于 Internet Explorer。它还适用于 Chrome 和开发服务器。我记得它昨天在 Chrome 和生产环境中工作过,但我不完全确定。无论如何,我遇到的问题是为什么 Chrome 忽略了这两种缓存机制。我怀疑这可能与仅为 chrome 生成的分块编码有关,但我不明白为什么在这种情况下禁用缓存

现在有很多细节。

火狐

初始请求 header :

Host: eduzabawy.appspot.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Range: bytes=0-
Referer: http://eduzabawy.appspot.com/dziecko/
Cookie: children="jEDor1B8VRDRJreWmUVlUQ\075\075"; session=eyJfc2lkIjoiWk91QmlsOEJlTEd4QVFuYVFiYkpsTyJ9|1365190508|81d81772f6f409dd57ad43a9f447f92d1b56d29e
Connection: keep-alive

初始响应 header :

HTTP/1.1 206 Partial Content
Cache-Control: public max-age=100000000
Content-Range: bytes 0-37249/37250
Content-Type: audio/ogg
Date: Fri, 05 Apr 2013 19:45:47 GMT
Etag: blobstore
Server: Google Frontend
X-Firefox-Spdy: 3

在随后的加载中,Firefox 似乎甚至没有尝试获取文件。这就是我认为它应该工作的方式。

互联网浏览器

初始请求 header :

Accept: */*
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Referer: http://eduzabawy.appspot.com/dziecko/
Accept-Language: pl-PL
Accept-Encoding: gzip, deflate
Host: eduzabawy.appspot.com
Connection: Keep-Alive
Cookie: children="WyzUQwHEzwX6qnjfn21KEw\075\075"; session=eyJfc2lkIjoia2VOd0llR0hvRHU1cUN0cE1QSWRpWCJ9|1365192921|f2279f82b21947c4d064dbf44a5ce9e1bd95cc0d

初始响应 header :

HTTP/1.1 200 OK
Cache-Control: public max-age=100000000
ETag: blobstore
Content-Type: audio/mpeg
Date: Fri, 05 Apr 2013 20:15:23 GMT
Server: Google Frontend
Content-Length: 4637

后续请求头:

Accept: */*
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Referer: http://eduzabawy.appspot.com/dziecko/
Accept-Language: pl-PL
Accept-Encoding: gzip, deflate
Host: eduzabawy.appspot.com
If-None-Match: blobstore
Connection: Keep-Alive
Cookie: children="WyzUQwHEzwX6qnjfn21KEw\075\075"; session=eyJfc2lkIjoia2VOd0llR0hvRHU1cUN0cE1QSWRpWCJ9|1365192921|f2279f82b21947c4d064dbf44a5ce9e1bd95cc0d

后续响应头:

HTTP/1.1 304 Not Modified
ETag: blobstore
Content-Type: audio/mpeg
Content-Length: 4637

Chrome + 开发服务器

初始请求 header :

Host: localhost:8080
Connection: keep-alive
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Accept: */*
Referer: http://localhost:8080/dziecko/
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3
Cookie: children="xYNsqzfdtZ-2Z764lFSzk1Ed8-g1QoNlcaexsD79gSY\075"; session=eyJfc2lkIjoiTE9CZDc0SHJENHF4OWJua1J4S3dTQSJ9|1365192253|37815772acab0bf44a0c501ea0fd0dc7c617dd09
Range: bytes=0-

初始响应 header :

HTTP/1.1 206 Partial Content
etag: blobstore
cache-control: public max-age=100000000
content-type: audio/mpeg
Content-Range: bytes 0-4636/4637
Content-Length: 4637
Server: Development/2.0
Date: Fri, 05 Apr 2013 20:32:19 GMT

后续请求头:

Host: localhost:8080
Connection: keep-alive
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Accept: */*
Referer: http://localhost:8080/dziecko/
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3
Cookie: children="xYNsqzfdtZ-2Z764lFSzk1Ed8-g1QoNlcaexsD79gSY\075"; session=eyJfc2lkIjoiTE9CZDc0SHJENHF4OWJua1J4S3dTQSJ9|1365192253|37815772acab0bf44a0c501ea0fd0dc7c617dd09
Range: bytes=0-4636
If-None-Match: blobstore

后续响应头:

HTTP/1.1 304 Not Modified
Content-Type: text/html
Server: Development/2.0
Date: Fri, 05 Apr 2013 20:33:08 GMT

Chrome + 生产服务器

初始请求 header :

Host: eduzabawy.appspot.com
Connection: keep-alive
Accept-Encoding: identity;q=1, *;q=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31
Accept: */*
Referer: http://eduzabawy.appspot.com/dziecko/
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3
Cookie: children="sU9aqnqEf67eZFpS7BKSMw\075\075"; session=eyJfc2lkIjoieFlGWlJLMnRwSHJuOVFCb1haTnJLUCJ9|1365194193|2a13cd9eb7aceeb40c43bd82a763d893436d9f1f
Range: bytes=0-

初始响应 header :

HTTP/1.1 206 Partial Content
Cache-Control: public max-age=100000000
ETag: blobstore
Content-Type: audio/mpeg
Content-Range: bytes 0-4636/4637
Date: Fri, 05 Apr 2013 20:36:35 GMT
Server: Google Frontend
Transfer-Encoding: chunked

后续请求和响应与初始相同。

最佳答案

你的 max-age 似乎太长了,超过了 3 年......我从某个地方读到你应该在 GAE 中设置的最大值不超过 1 年。

无论如何,您还应该尝试设置一个 header (Pragma: Public),它对我有用(不过我正在从 blobstore 缓存图像,这里有几行来 self 的源代码):

httpResponse.Header().Set("Cache-Control", "public, max-age=600")
httpResponse.Header().Set("Pragma", "Public")
blobstore.Send(httpResponse, project.ImageBlobKey)

顺便说一下,上面的内容也会导致 Google 从边缘缓存传送您的文件,这确实大大加快了静态资源的速度!

关于google-app-engine - 为什么 chrome 不缓存 google app engine blobstore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843333/

相关文章:

Angular:当使用 innerHTML 并禁用缓存时,图像会在单击时重新加载

javascript - 当客户端通过点击后退按钮到达一个页面时,如何让它加载一个新的副本而不是缓存的副本?

java - JSTL Google 应用引擎问题

http - 将工作的curl请求转换为HTTP

javascript - django REST framework 嵌套序列化程序和带有文件的 POST 嵌套 JSON

html - 浏览器如何检测 GIF 图像大小?

java - 为什么 Chrome DevTools 说我的静态资源在使用 Spring 的 mvc :resources? 映射时显式不可缓存

python 类方法 get_by_user 返回 None

python - 将视频从 Google Cloud Bucket 流式传输到 iOS 的最佳方式是什么?

python - 应用引擎 : "URLFetch is not available in this environment."