【问题标题】:Google App Engine not generating 304, instead generating 200 alwaysGoogle App Engine 不生成 304,而是始终生成 200
【发布时间】:2013-10-19 09:29:15
【问题描述】:

Google App 引擎总是为 url /test.js 生成 200 并且 test.js 不是静态资源,而是动态生成内容的 url 模式。内容将在 N 小时后过期,并生成新的内容。

我尝试过使用 Last-Modified、ETag 和 Cache-Control。似乎没有任何工作。

请求

请求网址:http://localhost:8081/test.js 请求方法:GET 状态码:200 OK 接受:*/* 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8 缓存控制:max-age=0 连接:保持活动 主机:本地主机:8081 If-Modified-Since:Fri, 18 Oct 2013 14:10:39 GMT 如果没有匹配:“1B2M2Y8AsgTpgAmY7PhCfg” 参考:http://localhost:8080/ 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36

响应标头

缓存控制:公共,最大年龄=360000 内容长度:2 内容类型:应用程序/脚本;字符集=utf-8 日期:格林威治标准时间 2013 年 10 月 18 日星期五 14:10:40 etag:“1B2M2Y8AsgTpgAmY7PhCfg” 过期时间:2013 年 10 月 22 日星期二 18:10:40 GMT 最后修改时间:格林威治标准时间 2013 年 10 月 18 日星期五 14:10:40 服务器:开发/2.0

【问题讨论】:

  • 你想做什么?您遗漏了太多细节,以至于没人会猜对。

标签: google-app-engine caching


【解决方案1】:

您的请求包含Cache-Control:max-age=0,因此任何中间缓存(包括浏览器缓存)都不会提供缓存内容。这可能是您的浏览器设置的结果。

对于带有重新验证标头 (If-X) 的请求,您需要有适当的逻辑才能正确执行。为了节省带宽,这很简单 webob(由 webapp2 和其他框架使用)和conditional-response setting。避免计算也更多地取决于你在做什么,但是webob helps here too

Redbot 是一个非常有用的检查 HTTP 缓存行为的工具。

【讨论】:

    【解决方案2】:

    请参阅此处了解 HTTP 状态: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

    200 只是正确的 HTTP OK 状态,对资源是否为静态没有任何解释。 (尝试任何动态网页,例如 facebook),您会注意到它是 200。响应为 200 是完全正常的

    对于 304,它是“未修改”-如 w3 中所述“304 响应不得包含消息正文”。这不是你想要的。

    在您的情况下,您应该为这些 http 标头设置正确的到期时间(在您的程序代码中执行此操作),以便浏览器始终在到期时间后(例如 1 小时后)请求内容的新副本):

    cache-control:public, max-age=3600
    expires:Tue, 20 Oct 2013 18:10:40 GMT
    

    【讨论】:

      猜你喜欢
      • 2014-06-05
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多