【问题标题】:GAE's appspot.com cache-control header - HTTP STATUS 304GAE 的 appspot.com 缓存控制标头 - HTTP STATUS 304
【发布时间】:2023-04-08 09:43:01
【问题描述】:

我的 GAE 开发 (Java) 上有很多鼠标悬停图像。我在appspot.com 上托管了它。我得到的当前缓存控制标头 = 无缓存,重新验证。因此,当图像悬停并鼠标移出时,它会重新加载图像,然后这就是延迟的来源......

我不知道如何处理这个问题。请帮忙(Java 解决方案)?

已编辑 ==>

appengine.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>s~xxxxxx</application>

    <version>1</version>

    <static-files>
        <include path="/images/**" expiration="1d" />
        <include path="/scripts/**" expiration="1d" />
        <include path="/stylesheets/**" expiration="1d" />
        <include path="/*.p12" expiration="1d" />
        <include path="/favicon.ico" expiration="1d" />
    </static-files>

    <threadsafe>true</threadsafe>

    <warmup-requests-enabled>true</warmup-requests-enabled>

    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>

    <sessions-enabled>true</sessions-enabled>
</appengine-web-app>

部署后第一次加载图像(http://xxx.appspot.com/images/myicon.png)时,我会得到这样的东西。有 2 个缓存控制...我猜“无缓存”缓存控制取代了早期的私有缓存控制。

但是如果我再次刷新该页面,它将返回 http 1.1 304 Not Modified。

【问题讨论】:

  • 我做了,但一点用都没有!
  • 这些图片是静态文件吗?如果是这样,请您分享您的appengine-web.xml,以便其他人可以复制吗?如果这些文件由动态处理程序提供,请分享您的代码。
  • 好吧,你不明白这个……举个例子。一个纯调用servername/images/image.png,这个会给出“HTTP 1.1 304 Not Modified”标头状态,缓存控制是“no-cache, must-revalidate”。

标签: google-app-engine


【解决方案1】:

如果您以管理员身份登录,应用引擎将尝试禁止缓存行为。您可以通过注销或其他帐户尝试吗?

这是一个相关的问题: http://code.google.com/p/googleappengine/issues/detail?id=8509

【讨论】:

  • 你能分享其中一张图片的实际链接吗?我会检查回复。我的电子邮件地址是 matsuo.takashi@gmail.com。
  • 如果管理员希望此功能可用怎么办?我有很多域管理员(供谷歌使用)实际运行这个 GAE 网站,所以你告诉我 mouseover 和 mouseout 实际上不是 GAE UI 设计的好主意?
  • Takashi,感谢您的帮助。但我托管的 GAE 网站在我的私人域(付费)内,而不是公共域。
  • 我刚刚给你发了一封电子邮件。谢谢!
  • 如果您使用非管理员帐户体验它,这是一个错误。请在我们的问题跟踪器上提交错误。如果您希望应用引擎不抑制缓存行为,请提交功能请求。这里有一些解决方法;也许您可以为应用引擎应用程序设置另一个帐户(与您通常使用的帐户不同),或者您可以在页面加载时预取这些图像。
【解决方案2】:

我在使用 Google App Engine for Java 配置浏览器缓存和在静态文件上定义 Expires 标头时也遇到了一些问题。问题是 web.xml 中的过滤器映射否决了静态文件的配置。我在这里记录了问题和解决方案: How to set Expires headers on static files with Google App Engine。检查或分享您的 web.xml 文件可能会很有趣。

【讨论】:

    【解决方案3】:

    必须是 Java 解决方案吗?避免 Web 请求和延迟(在第一次请求之后)的纯 CSS 解决方案怎么样?如果您将所有翻转图像放在一个图像中,并将每个翻转图像(精灵)的坐标放入 CSS 中,您将几乎立即以浏览器显示它们的速度看到图像。

    以下是精灵信息的一些链接:

    最后一个链接使用了这个示例 CSS:

    #logo-link
    {
    width:191px;
    height:151px;
    text-decoration:none;
    display:block;
    background-image:url(dw-logo-sprite.jpg);
    background-position:191px 0;
    }
    #logo-link:hover,#logo-link:active  { background-position:0 0; }
    

    基本上,您在 CSS 中声明图像的 URL 一次并包含第一个精灵的几何图形。悬停时,它会更改几何图形以使用(同一图像的)第二个精灵。

    【讨论】:

      【解决方案4】:

      如果您出于某种原因想要从 servlet 提供图像,那么您可以使用 Jersey 像这样设置 cache-control 响应标头:

      @GET
      @Path("/{url}/{maxHeight}")
      @Produces("image/jpeg")
      public Response view(
              @Context HttpServletRequest req,
              @PathParam("url") String url,
              @PathParam("maxHeight") int maxHeight
      ) throws IOException, URISyntaxException {
          ... [code to generate imageData]
          return Response
                  .ok(imageData)
                  .cacheControl(CacheControl.valueOf("max-age=2592000"))
                  .build();
      }
      

      ```

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-07
        • 2017-06-01
        • 1970-01-01
        • 2021-01-28
        • 2011-01-13
        • 2013-04-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多