由于缓存控制标头,如何绕过 Internet Explorer 11 忽略我的字体?

Posted

技术标签:

【中文标题】由于缓存控制标头,如何绕过 Internet Explorer 11 忽略我的字体?【英文标题】:How to get around Internet Explorer 11 ignoring my font-face due to cache-control headers? 【发布时间】:2021-06-16 05:32:15 【问题描述】:

问题:

IE11 不使用我的 Roboto 字体或我的 Material Icon 字体。我已将问题缩小到缓存控制。当我从 web.config 中删除以下内容时,IE11 会像任何其他浏览器一样显示我的字体和图标。我在这里找到了这个解决方案https://***.com/a/37270083/10316412

<add name="Cache-Control" value="no-cache" />
<add name="Pragma" value="no-cache" />

但是,我更不想删除它。我们的安全扫描要求我们没有缓存。由于子资源的完整性,我们也不应该链接到外部字体/图标...这就是为什么我将字体和图标下载到我的资产文件夹中。

我的问题:

为什么缓存控制会影响我的字体无法加载?我怎样才能解决这个问题?我可以为我的资产文件夹指定没有缓存控制标头吗?

字体代码供参考:

@font-face 
  font-family: "Roboto";
  src: url(./assets/fonts/Roboto/Roboto-Regular.ttf);


@font-face 
  font-family: "Roboto-Light";
  src: url(./assets/fonts/Roboto/Roboto-Light.ttf);


@font-face 
  font-family: "Roboto-Medium";
  src: url(./assets/fonts/Roboto/Roboto-Medium.ttf);


@font-face 
  font-family: "Roboto-Bold";
  src: url(./assets/fonts/Roboto/Roboto-Bold.ttf);


@font-face 
  font-family: "Roboto-Italic";
  src: url(./assets/fonts/Roboto/Roboto-Italic.ttf);


@font-face 
  font-family: "Material Icons";
  font-style: normal;
  font-weight: 400;
  src: url(assets/google-icons/font/MaterialIcons-Regular.eot); /* For IE6-8 */
  src: local("Material Icons"), local("MaterialIcons-Regular"),
    url(assets/google-icons/font/MaterialIcons-Regular.ttf) format("truetype"),
    url(assets/google-icons/font/MaterialIconsOutlined-Regular.otf) format("opentype"),
    url(assets/google-icons/font/MaterialIconsRound-Regular.otf) format("opentype"),
    url(assets/google-icons/font/MaterialIconsSharp-Regular.otf) format("opentype"),
    url(assets/google-icons/font/MaterialIconsTwoTone-Regular.otf) format("opentype");

【问题讨论】:

您可以拥有多个 web.config 文件,以及为您的“资产”文件夹单独控制位置特定设置。见:docs.microsoft.com/en-us/troubleshoot/aspnet/… 您好,请问这个问题呢?我下面的回答对解决这个问题有帮助吗?如果是这样,您可以参考this,它可以帮助其他社区成员将来解决类似的问题。感谢您的理解。 【参考方案1】:

正如整篇博文所述,删除缓存控制和编译指示标头肯定会解决问题。但是我有一些要求来保留这些标题。虽然我没有直接解决这个问题,但我就是这样解决的 -

我们的应用程序部署到使用 Azure Front Door 的 Azure 应用服务。我相信前门用它自己的标题覆盖了一些标题,所以当我将它部署到有前门的环境时,问题完全消失了。

我还应该提到,我确实尝试了 &lt;location&gt;path 的建议,但这些对我不起作用。

【讨论】:

【参考方案2】:

1.为什么缓存控制会影响我的字体无法加载?

我找到了a blog,它详细解释了这个问题。我觉得作者在博客里说的理由很有道理:

IE 向服务器请求字体。 只要服务器开始交付资源,IE 就会关闭连接。可能是因为它突然检测到它应该从缓存中获取资源。 这种行为显然会破坏缓存内容。所以 IE 无法访问字体。 IE 尝试检索下一个声明的字体,但使用相同的错误模式。 最后这一切都导致没有字体和一个混乱的网站。

2。我怎样才能解决这个问题?我可以为我的资产文件夹指定没有缓存控制标头吗?

该问题的解决方法与您发现的一样:删除 no-cache 标头。

关于为不同的文件指定不同的header,我觉得Alex的评论是对的。您还可以参考this thread 中接受的答案,以使用 web.config 中的&lt;location&gt; 元素和path 属性来实现您想要的。

【讨论】:

以上是关于由于缓存控制标头,如何绕过 Internet Explorer 11 忽略我的字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在亚马逊云端设置缓存控制标头?

如何使用控制缓存标头?

如何在 HTTP 请求中正确使用缓存控制标头

Web缓存控制策略详解

如何通过 ebextensions 配置文件添加 nginx 缓存控制标头?

如何设置清漆缓存控制头