26

我推送了我网站的新版本,但现在 CSS 和静态图像没有正确部署。

这是混乱的页面:http ://www.gaiagps.com

Appengine 显示最新版本是正确的:http: //1.latest.gaiagps.appspot.com/

有什么帮助吗?

4

12 回答 12

28

我以前在 App Engine 上看到过这种情况,即使使用缓存清除查询参数(如/stylesheets/default.css?{{ App.Version }}.

这是我的(未经证实的)理论:

  1. 您可以通过将新版本部署或更改为default.
  2. 虽然此更新正在传播到运行您的应用程序的所有 GAE 实例...
  3. ...有人点击您的网站。
  4. 静态资源的请求default.css{{ App.Version }}被发送到谷歌的 CDN,它还没有它。
  5. Google 的 CDN 在从步骤 #2 对所有实例进行传播之前向 GAE 询问资源。
  6. 如果你不走运,GAE 会从运行旧版本的实例中提供资源......
  7. ...现在作为权威的“新”版本缓存在 Google 的 CDN 中。

当这种情况(如果发生这种情况)发生时,我可以确认,再多的缓存破坏浏览器工作也无济于事。Google CDN 服务器持有错误的版本。

解决方法:我发现解决此问题的唯一方法是部署另一个版本。您不会冒再次发生这种情况的风险(如果您在竞态条件之后没有进行任何 CSS 更改),因为即使发生竞态条件,您的第一次更新也可能在您部署第二次更新时完成,所以无论如何,所有实例都将提供正确的版本。

于 2011-01-29T17:35:03.873 回答
3

以下是对我有用的。

  1. 从静态域提供您的 css 文件。这是由 GAE 自动创建的。

    //static.{your-app-id}.appspot.com/{css-file-path}

  2. 部署您的应用程序。此时您的应用程序将被破坏。

  3. 更改css文件的版本

    //static.{your-app-id}.appspot.com/{css-file-path}?v={version-Name}

  4. 再次部署。

每次更改 css 文件时。您将不得不重复 2,3 和 4。

于 2012-01-14T20:05:45.667 回答
2

您的链接对我来说看起来不错,除非我遗漏了什么。

您可能已经缓存了旧的 CSS,并且在更新后没有获得新的 CSS。尝试清除浏览器缓存,看看是否有效。

转到 1.latest 会下载新的 CSS,因为它不在你的缓存中,所以它对你来说是正确的。

于 2010-05-06T17:26:14.863 回答
2

我也有这个问题。我正在使用带有 GAE 的烧瓶,所以我的app.yaml. 当我添加它时,部署工作。尝试添加这样的东西

handlers:
- url: /static
  static_dir: static

到您app.yaml并再次部署。它对我有用。显然,谷歌正试图通过不更新它认为用户看不到的文件来进行优化。

于 2014-03-17T21:12:44.817 回答
2

Shoresh发现,Pyhton标准环境的文档指出,静态缓存过期设置、单个元素expiration和顶级元素default_expiration都负责定义“过期时间 [that] 将在Cache-ControlExpiresHTTP响应头”。这意味着“文件可能会被用户的浏览器以及中间缓存代理服务器(例如 Internet 服务提供商)缓存”。

这里的问题是“重新部署应用程序的新版本不会重置任何缓存”。因此,如果设置default_expiration为例如 15 天,但更改了 CSS 或 JS 文件并重新部署应用程序,则无法保证这些文件会由于活动缓存而自动提供服务,尤其是由于中间缓存代理服务器,可能包括谷歌云服务器——似乎是这种情况,因为访问 your-project-name.appspot.com 也会提供过时的文件。

上面链接的相同文档指出“如果您打算修改静态文件,它应该有一个短的(少于一小时)到期时间。在大多数情况下,默认的 10 分钟到期时间是合适的”。这是在设置任何静态缓存过期之前应该考虑的事情。但是对于那些像我一样事先并不知道所有这些并且已经被这个问题所困扰的人,我已经找到了解决方案。

尽管文档说明无法清除这些中间缓存代理,但至少可以删除 Google Cloud 缓存。

为此,请前往您的Google Cloud Console并打开您的项目。在左侧汉堡菜单下,前往存储 -> 浏览器。您应该在那里找到至少一个 Bucket:your-project-name.appspot.com。在 Lifecycle 列下,单击与 your-project-name.appspot.com 相关的链接。删除任何现有规则,因为它们可能与您现在将创建的规则冲突。

通过单击“添加规则”按钮创建新规则。对于对象条件,选择“较新版本”选项并将其设置为 1。不要忘记单击“继续”按钮。对于该操作,选择“删除”并单击“继续”按钮。保存您的新规则。

这个新创建的规则最多需要 24 小时才能生效,但至少对我的项目来说只需要几分钟。一旦启动并运行,您的应用程序在 your-project-name.appspot.com 下提供的文件版本将始终是最新部署的,从而解决了问题。此外,如果您经常编辑静态文件,则应default_expiration从 app.yaml 文件中删除该元素,这将有助于避免其他服务器意外缓存。

于 2018-10-26T21:40:42.227 回答
1

好的对于看到这个问题的新人,我尝试了缓存爆破方法,似乎已经修复了这里是我为 app.cfg 文件上的 css 导入所做的一个示例,创建一个变量来保存您在 app.yaml 中设置的 appid文件并将其设置为以下之一

<link href="{{ url_for('static', filename='file.css') }}?{{config.APP_ID}}" rel="stylesheet"> 

同样对于 app.yaml 文件,添加此配置以确保安全

处理程序:

  • 网址:/静态静态目录:静态
于 2019-02-21T14:04:22.677 回答
0

这对我有用:

首先,我更改了app.yaml上的版本

然后按照以下步骤操作

转到您的控制台-> 单击您的项目。

在侧边菜单上,单击计算->版本

那里将有所有版本,以及哪个版本是默认的。我的设置为旧版本。

标记新版本。

为我工作。有什么顾虑吗?

于 2014-12-03T01:20:54.413 回答
0

来自 Pyhton 标准环境的文档:static_cache_expiration

在一个给定的过期时间传输文件后,通常没有办法将其从中间缓存中清除,即使用户清除了自己的浏览器缓存。重新部署应用程序的新版本不会重置任何缓存。因此,如果您打算修改静态文件,它应该有很短的(不到一小时)到期时间。在大多数情况下,默认的 10 分钟到期时间是合适的。

于 2018-07-31T19:04:57.553 回答
0

对于来到这个旧问题/答案集的新人,我想给出一个更新的答案。我认为在 2018-19 年,以下信息可能会解决人们遇到的大多数 CSS 更新问题:

确保您app.yaml具有以下内容:

 handlers:
   - url: /static
     static_dir: static
  • gcloud app deploy
  • 冷静 10 分钟.. 然后轮班重新加载您的网站

谷歌也建议使用这种方法(https://cloud.google.com/appengine/docs/standard/python/getting-started/serving-static-files)。

于 2018-12-27T02:35:47.947 回答
0

确保在dispatch.yaml文件的 url 和服务设置的末尾添加通配符。

例子:

dispatch:
  - url: "example.com/*"
    service: default

  - url: "sub.example.com/*"
    service: subexample
于 2020-09-11T00:56:43.040 回答
0

如果您使用 2020 GCP App Engine,只需添加default_expiration到您的 app.yaml 文件并将其设置为1m.

default_expiration: "1m"

更多信息:https ://cloud.google.com/appengine/docs/standard/python3/config/appref/#runtime_and_app_elements

于 2020-11-28T09:10:24.553 回答
-1

尝试清除浏览器上的缓存。有完全相同的问题,只需清除缓存即可解决。

于 2012-12-06T12:24:59.200 回答