【问题标题】:Using @font-face slows load time. Can I force the client to cache the font?使用 @font-face 会减慢加载时间。我可以强制客户端缓存字体吗?
【发布时间】:2024-01-15 12:36:01
【问题描述】:

更新: 看起来标头请求信息是罪魁祸首。如何更改请求标头的 max-age 属性? TIA。


您好,我在一个网站上使用@font-face,我遇到了文本加载延迟(可能是由于每页都加载了字体)。我知道客户端必须下载一次字体才能正常显示,但是每一页?

有没有办法强制浏览器缓存该文件?还是有另一种方法可以加快字体的加载时间? (这个问题在Server Fault上发帖更合适吗?)

提前致谢。最坏的情况,我会忍受延迟,所以我不需要任何“起飞@font-face”的答案......;)

其他信息:

  • 我已经在 Mac 和 Windows(XP 和 7)上的 Safari (4) 和 Firefox (3.5RC1) 中对此进行了测试
  • 我测试过的所有浏览器目前都设置为允许缓存(默认开启)
  • 网址不是动态的,它只是“/fonts/font.otf”
  • 字体 URL 是正确的,因为页面加载了字体并正确显示它,虽然比正常慢
  • 请求标头:

    缓存控制:max-age=0
    If-Modified-Since:2009 年 6 月 24 日星期三 03:46:28 GMT
    If-None-Match:W/"484d9f2-a5ac-46d10ff2ebcc0"
    推荐人:http://testurl.com/
    用户代理:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6; en-us) AppleWebKit/530.13 (KHTML, like Gecko) Version/4.0 Safari/530.15

  • 响应标头:

    连接:保持活动状态
    日期:格林威治标准时间 2009 年 6 月 25 日星期四 02:21:31
    电子标签:“484d9f2-a5ac-46d10ff2ebcc0”
    保活:超时=10,最大值=29
    服务器:Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635

【问题讨论】:

  • 您能否发布当前为请求字体而发送的标头?
  • 感谢马特的提问,我已经添加了。看起来 max-age 就是这样做的。我如何将其更改为更长的持续时间?
  • 响应头呢?这些同样重要,甚至更多。
  • 设置 max-age 是服务器和语言特定的事情。如果你在 apache 上看看 mod_expires
  • K,我添加了响应头。我来看看 mod_expires。非常感谢。

标签: css font-face


【解决方案1】:

你永远不能强迫浏览器缓存某些东西,只能鼓励它。我想不出为什么不缓存具有正确过期标头的字体文件的原因,这将我们带到:

  • 这是一个浏览器错误(你不说是哪个浏览器)
  • 您的缓存控制标头丢失或错误
  • 您的浏览器配置为不缓存任何内容(是否缓存图像?)
  • 您的字体 URL 是动态的,因此浏览器认为每个请求都针对不同的资源
  • 字体文件实际上丢失或 URL 拼写错误。
  • 延迟不是由字体下载引起的(你确实说过你假设这是问题所在)

我认为需要更多信息。

编辑:设置缓存控制是服务器和语言特定的事情。查看mod_expires 了解有关在 Apache 中进行缓存的信息。

【讨论】:

  • 感谢您的回复,我已更新帖子以反映您的一些观点。我还将更详细地查看缓存控制标头信息,以确保我没有在那里犯错。我认为这是下载问题的原因是当我在本地服务器上测试网站时(下载速度明显接近于零),特殊字体会在正常时间加载(与常规文本相同)。
【解决方案2】:

您确定您的字体文件是可缓存的吗?就像其他静态内容一样,它们应该有很远的过期日期,并且它们的标题应该被配置为允许它们被缓存。如果您将字体托管在服务器场上,您将需要确保您的 etag 标头在场中的所有服务器上均已标准化...否则后续对字体的请求可能会强制从备用服务器重新下载它即使已经从另一台服务器下载了相同的数据。

【讨论】:

  • 很好的评论,但是,这不是正在发生的事情,因为我没有在服务器场上托管文件。至于文件的标题,是的,它们被配置为允许缓存,但我正在尝试“强制”缓存(因为文件永远不会改变)。
  • 除了允许缓存之外,请确保您有一个遥远的到期日期。很多时候我会在一些静态内容上启用缓存,但不会给它一个遥远的过期日期......它会拒绝缓存(FireFox是最好的测试,因为它过于挑剔拥有完全正确的标题以缓存某些内容...Opera 更加宽松,而 IE 是不可预测的。)
  • 我会调查并确保我已经把它们设置好了。感谢您的提醒!
最近更新 更多