由于 cache-control headers,如何绕过 Internet Explorer 11 忽略我的 font-face?

How to get around Internet Explorer 11 ignoring my font-face due to cache-control headers?

问题:

IE11 不使用我的 Roboto font-face 或我的 Material 图标 font-face。我已将问题缩小到 cache-control。当我从 web.config 中删除以下内容时,IE11 会像其他浏览器一样显示我的字体和图标。我在这里

找到了这个解决方案
<add name="Cache-Control" value="no-cache" />
<add name="Pragma" value="no-cache" />

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

我的问题:

为什么 cache-control 会影响我的字体无法加载?我该如何解决这个问题?我可以指定资产文件夹没有 cache-control headers 吗?

font-face代码参考:

@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");
}

1.为什么 cache-control 会影响我的字体无法加载?

我发现 a blog 详细解释了问题。我觉得作者在博客里说的有道理:

  • IE requests the font from the server.
  • As soon as the server starts delivering the resource, IE closes the connection. Probably because it suddenly detects that it should get the resource from cache.
  • This behaviour apparently destroys the cache content. So IE can’t access the font.
  • IE tries to retrieve the next declared font but with the same wrong pattern.
  • At the end it all leads to no font and a messy web site.

2。我该如何解决这个问题?我可以指定资产文件夹没有 cache-control header 吗?

该问题的解决方法与您所发现的一样:删除 no-cache header.

关于为不同的文件指定不同的header,我认为Alex的评论是正确的。您还可以参考 this thread 中已接受的答案,使用 <location> 元素和 web.config 中的 path 属性来实现您想要的。

正如在整个 post 中提到的, 删除 cache-control 和 pragma headers 确实解决了问题 。但是我有一定的要求来保留这些 headers。虽然我没有直接解决这个问题,但这是为我解决的方式 -

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

我还应该提一下,我确实尝试了 <location>path 的建议,但这些对我不起作用。