如何在WebKit中控制Google App Engine缓存行为(etags疯狂)?

kam*_*ens 23 google-app-engine caching webkit google-chrome http-status-code-304

情况:运行Google App Engine站点,我的静态内容的default_expiration设置为"14d"

问题:在Chrome和Safari中,访问URL(重新加载,只是将光标放在地址栏中并按Enter)会导致大量请求被If-None-Match标头触发.正如预期的那样,响应总是304 Not Modified.我可以看到这些请求在Charles或Fiddler等调试代理中被触发.

想要:完全避免这些请求和完全针对静态内容的304响应 - 只需信任浏览器缓存的内容即可.

我们使用标准的"缓存静态内容很长一段时间,当我们需要破坏缓存"系统时,我们将负责对我们的查询字符串进行附加?version = {version}修改,所以我们真的很想避免304的.

信念:我认为这是由app引擎随每个静态内容响应发送的etag标头引起的.在App Engine SDK并没有下来发送这个头,并与SDK乱搞的时候我没有看到这个304的行为.

有什么建议?你可以关闭app引擎静态内容的etags吗?

更新了静态内容的示例: http ://www.khanacademy.org/stylesheets/shared-package/compressed.css

kam*_*ens 8

虽然我不相信有任何方法可以控制GAE的etags标头行为,但这是由于WebKit中的一个错误导致在POST请求后接收302重定向时重新下载所有静态内容.

一旦WebKit修复了这个bug,问题就会消失.

如果必须,您可以通过刷新标头重定向而不是使用302重定向来暂时解决此特定的重定向后POST错误.

https://bugs.webkit.org/show_bug.cgi?id=38690

在Post/Redirect/Get上重新加载WebKit图像

http://www.google.com/support/forum/p/Chrome/thread?tid=72bf3773f7e66d68&hl=en


Sam*_*tos 5

您需要删除Last-Modified和ETag标头.

通过删除ETag标头,您可以禁用缓存和浏览器以验证文件,因此他们不得不依赖您的Cache-Control和Expires标头.实体标记(ETag)是一种检查较新版本的缓存文件的机制.

删除Last-Modified和ETag标头,您将完全消除If-Modified-Since和If-None-Match请求及其304 Not Modified响应,因此文件将保持高速缓存而不检查更新,直到Expires标头指示新内容是可用的.

更多信息:http://www.samaxes.com/2008/04/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/.

不幸的是,我不知道如何为GAE的静态内容关闭它们.