css - 由于缓存控制标头,如何绕过 Internet Explorer 11 忽略我的字体?
问题描述
问题:
IE11 不使用我的 Roboto 字体或我的 Material Icon 字体。我已将问题缩小到缓存控制。当我从我的web.config中删除以下内容时,IE11 会像任何其他浏览器一样显示我的字体和图标。我在这里找到了这个解决方案https://stackoverflow.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");
}
解决方案
1. 为什么缓存控制会影响我的字体无法加载?
我找到了一个详细解释问题的博客。我认为作者在博客中说的原因是有道理的:
- IE 从服务器请求字体。
- 一旦服务器开始交付资源,IE 就会关闭连接。可能是因为它突然检测到它应该从缓存中获取资源。
- 这种行为显然会破坏缓存内容。所以IE无法访问字体。
- IE 尝试检索下一个声明的字体,但使用相同的错误模式。
- 最后,这一切都导致没有字体和混乱的网站。
2. 我怎样才能解决这个问题?我可以为我的资产文件夹指定没有缓存控制标头吗?
该问题的解决方法就像您发现的一样:删除no-cache
标题。
关于为不同的文件指定不同的标题,我认为亚历克斯的评论是对的。您还可以参考此线程中接受的答案,以使用web.config 中的<location>
元素和path
属性来实现您想要的。
推荐阅读
- php - 使用 Google OAuth2 和 PHP 登录:Google_Client::getRefreshToken() 始终返回 null
- python - 使用 wikipedia 模块的 Python 出错:wikipedia.exceptions.PageError:页面 ID“harry plotter”与任何页面都不匹配。换个身份证试试
- javascript - 仅在调用组件时实现 @hostListener
- java - AES 加密和解密 (JAVA)
- python - 在同一行中找到两个出现
- java - 在 OutOfMemoryError 之后阻止 future.get() 调用
- visual-studio-code - 如何在 Visual Studio Code 中禁用扩展建议?
- php - 无法使用 PHP 会话重定向到正确的页面
- mongodb - 如何按子数组的索引求和
- node.js - Sass:有没有办法递归地查看文件?