【问题标题】:Google App Engine serves static CSS files with wrong mime-typeGoogle App Engine 提供具有错误 mime 类型的静态 CSS 文件
【发布时间】:2018-10-30 20:03:52
【问题描述】:

我一直致力于在 Google App Engine 上托管一个新网站。我一直在将我的应用部署到一个开发项目中,它托管在这里:

开发:https://herdboss-dev.appspot.com/

它工作正常。

但是,当我采用完全相同的代码并将其部署到我的另一个项目中,该项目将成为真正的生产网站时,它以 application/octet-stream 而不是 text/css 的形式提供一些 css,因此这些文件不是t 被浏览器解析,所以我几乎所有的 css 都不能在生产站点上工作:

制作:https://herdboss-prod.appspot.com/

更奇怪的是,一些 css 被正确提供。 /css/normalize.css 被用作text/css,但/css/site.css 被用作application/octet-stream

https://herdboss-prod.appspot.com/css/normalize.css

https://herdboss-prod.appspot.com/css/site.css

https://herdboss-prod.appspot.com/js/jquery-ui-1.12.1.custom-theme/jquery-ui.min.css

我的 app.yaml 有一个用于 css 文件的静态处理程序:

- url: /css
  static_dir: css
  secure: always

我也尝试添加一个 mime_type,但这并没有改变任何东西:

- url: /css
  static_dir: css
  mime_type: 'text/css'
  secure: always

编辑:

在试验过程中,我将我的 site.css 切成两半并部署,然后它开始正常服务。然后我恢复了完整大小的 site.css,已部署......现在它仍然可以正常服务。

但我的 jquery-ui.min.css 仍然用作八位字节流。这太疯狂了。

编辑2:

而且它还在为我的 svg 提供错误的 mime 类型。

在 GAE 中,mime 打字完全被破坏了吗?如果是这样,为什么它在我的 dev gae 上工作?

【问题讨论】:

  • 我在 GAE 上有十几个项目,其中一些已经运行多年。从来没有看到任何与 CSS 或任何其他文件的 mime 类型有关的问题。问题不在于 GAE 方面。
  • 顺便说一句,我打开了您的生产站点,并且所有 CSS 都正确提供。希望这意味着您解决了问题。
  • 我刚刚在一个运行多年的 GAE-Platform python 项目上遇到了这个问题(并且没有对 css 文件进行修改)并且所有样式表都停止工作,被用作八位字节流 mime-type . Safari 诊断:“在严格模式下不允许非 CSS MIME 类型。” Chrome 和 FF 也停止工作。呃。哦,这很糟糕!
  • 似乎是缓存服务器(服务器:Google 前端)出现故障,直接访问每个版本 URL 都可以正常工作并且没有问题。它提供与 text/css 相同的文件,而另一个站点将其作为八位字节流提供,两者都返回服务器:Google Frontend。我希望有一些擦除缓存功能!
  • 最近我们的项目开始发生这种情况,主题有所不同:一些静态 javascript 文件以 text/plain mime 类型提供服务,因此浏览器不执行。幸运的是,这只影响了一个 QA 项目,而不是(还没有?)prod 项目。我认为这需要谷歌紧急干预,因为它具有灾难性的潜力。

标签: google-app-engine mime-types


【解决方案1】:

我的解决方案是:

  1. 复制有问题的文件并重命名
  2. 更改一个字节(否则不会上传/更新)
  3. 验证它是否作为样式表下载
  4. 在您的 html 中使用重命名、更改的 css 文件
  5. 等待原件正确送达:大约 24 小时后问题自行解决

GAE 问题跟踪器上有一个问题:https://issuetracker.google.com/issues/186012458

最初,我测试了一种解决方法,但这种解决方法在一天后就失效了:我修改了我的 HTML 以从版本服务器加载样式表,基本上是跨站点的 (hxxps://VERSION-dot-SERVER.appspot.com/static /stylesheet.css)。版本服务器提供了正确的 mime 类型......但只提供了一段时间。

我怀疑问题是由于极其罕见的竞争条件(上传期间的缓存访问/刷新?)导致的 MIME 类型错误。根本不可能欺骗 Google 前端来刷新文件。即使附加 .../styles.css?x=1 或切换回旧代码版本也不会触发刷新。

文件和它们的 mime 类型似乎是根据它们的哈希值存储的,因此即使只是重命名文件,重新上传具有相同内容的文件也没有效果。如果您部署具有重复文件的版本,您将看到“已上传 0 个文件”消息。它必须更改和重命名。

【讨论】:

    【解决方案2】:

    我确实检查了您的两个网站:https://herdboss-prod.appspot.com/https://herdboss-prod.appspot.com/

    我可以看到您有几个 CSS 文件:normalize.css、jquery-ui.min.css、base-min.css、grids-min.css、grids-responsive-custom.css、css?family=Open +无, site.css, ie-is-terrible.css, css_compiled.css.

    它们都正确地用作 Type: stylesheet

    如果您遇到此问题,我建议您进行以下测试:

    1. 在 Developer Console > Network 中检查内容类型,使用 Disable Cache > And reload page 选项。如果有帮助:清理浏览器缓存。
    2. 在不同的浏览器中检查页面的内容,因为根据渲染引擎的不同,内容可能会有不同的解释。
    3. 如果 1 和 2 不起作用,而您使用的是 nginx,则很可能是配置问题。更改文件 /etc/nginx/conf.d/default.conf。将 /etc/nginx/mime.types 放在“http”部分:
    http / {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        ....
    }  
    

    如果仍然无法正常工作,请将其移至位置部分

    location / {
     include       /etc/nginx/mime.types;
     ...
    }
    

    【讨论】:

    • 您的回答没有帮助。 Google App Engine标准环境的配置文件无法更改,不涉及客户端缓存,因为问题同时出现在FF、Chrome和Safari以及不同的计算机上。
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2014-07-29
    • 2019-05-19
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多