我推送了我网站的新版本,但现在 CSS 和静态图像没有正确部署。
这是混乱的页面:http ://www.gaiagps.com
Appengine 显示最新版本是正确的:http: //1.latest.gaiagps.appspot.com/
有什么帮助吗?
我推送了我网站的新版本,但现在 CSS 和静态图像没有正确部署。
这是混乱的页面:http ://www.gaiagps.com
Appengine 显示最新版本是正确的:http: //1.latest.gaiagps.appspot.com/
有什么帮助吗?
我以前在 App Engine 上看到过这种情况,即使使用缓存清除查询参数(如/stylesheets/default.css?{{ App.Version }}
.
这是我的(未经证实的)理论:
default
.default.css{{ App.Version }}
被发送到谷歌的 CDN,它还没有它。当这种情况(如果发生这种情况)发生时,我可以确认,再多的缓存破坏浏览器工作也无济于事。Google CDN 服务器持有错误的版本。
解决方法:我发现解决此问题的唯一方法是部署另一个版本。您不会冒再次发生这种情况的风险(如果您在竞态条件之后没有进行任何 CSS 更改),因为即使发生竞态条件,您的第一次更新也可能在您部署第二次更新时完成,所以无论如何,所有实例都将提供正确的版本。
以下是对我有用的。
从静态域提供您的 css 文件。这是由 GAE 自动创建的。
//static.{your-app-id}.appspot.com/{css-file-path}
部署您的应用程序。此时您的应用程序将被破坏。
更改css文件的版本
//static.{your-app-id}.appspot.com/{css-file-path}?v={version-Name}
再次部署。
每次更改 css 文件时。您将不得不重复 2,3 和 4。
您的链接对我来说看起来不错,除非我遗漏了什么。
您可能已经缓存了旧的 CSS,并且在更新后没有获得新的 CSS。尝试清除浏览器缓存,看看是否有效。
转到 1.latest 会下载新的 CSS,因为它不在你的缓存中,所以它对你来说是正确的。
我也有这个问题。我正在使用带有 GAE 的烧瓶,所以我的app.yaml
. 当我添加它时,部署工作。尝试添加这样的东西
handlers:
- url: /static
static_dir: static
到您app.yaml
并再次部署。它对我有用。显然,谷歌正试图通过不更新它认为用户看不到的文件来进行优化。
Shoresh发现,Pyhton标准环境的文档指出,静态缓存过期设置、单个元素expiration
和顶级元素default_expiration
都负责定义“过期时间 [that] 将在Cache-Control
和Expires
HTTP响应头”。这意味着“文件可能会被用户的浏览器以及中间缓存代理服务器(例如 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 文件中删除该元素,这将有助于避免其他服务器意外缓存。
好的对于看到这个问题的新人,我尝试了缓存爆破方法,似乎已经修复了这里是我为 app.cfg 文件上的 css 导入所做的一个示例,创建一个变量来保存您在 app.yaml 中设置的 appid文件并将其设置为以下之一
<link href="{{ url_for('static', filename='file.css') }}?{{config.APP_ID}}" rel="stylesheet">
同样对于 app.yaml 文件,添加此配置以确保安全
处理程序:
这对我有用:
首先,我更改了app.yaml上的版本。
然后按照以下步骤操作
转到您的控制台-> 单击您的项目。
在侧边菜单上,单击计算->版本:
那里将有所有版本,以及哪个版本是默认的。我的设置为旧版本。
标记新版本。
为我工作。有什么顾虑吗?
来自 Pyhton 标准环境的文档:static_cache_expiration。
在一个给定的过期时间传输文件后,通常没有办法将其从中间缓存中清除,即使用户清除了自己的浏览器缓存。重新部署应用程序的新版本不会重置任何缓存。因此,如果您打算修改静态文件,它应该有很短的(不到一小时)到期时间。在大多数情况下,默认的 10 分钟到期时间是合适的。
对于来到这个旧问题/答案集的新人,我想给出一个更新的答案。我认为在 2018-19 年,以下信息可能会解决人们遇到的大多数 CSS 更新问题:
确保您app.yaml
具有以下内容:
handlers:
- url: /static
static_dir: static
gcloud app deploy
谷歌也建议使用这种方法(https://cloud.google.com/appengine/docs/standard/python/getting-started/serving-static-files)。
确保在dispatch.yaml文件的 url 和服务设置的末尾添加通配符。
例子:
dispatch:
- url: "example.com/*"
service: default
- url: "sub.example.com/*"
service: subexample
如果您使用 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
尝试清除浏览器上的缓存。有完全相同的问题,只需清除缓存即可解决。