【问题标题】:Font Awesome With HTTPS使用 HTTPS 的字体真棒
【发布时间】:2014-05-05 09:19:00
【问题描述】:

所以在我自己的网站中使用 HTTPS 时,我在 IE8 中遇到了 Font Awesome 的问题,这甚至可以在 Font Awesome 自己的网站上重现。如果我在 IE8 中转到 Font Awesome over HTTPS ,我会得到所有图标的框,但是如果我转到 Font Awesome over HTTP,我会正确呈现图标。

这里有什么问题?我听说这可能与 Font Awesome over HTTPS 中的相对字体路径有关,但不确定。

下面是给喜欢这类东西的人的截图:

更新

所以这里是引用字体并加载 CSS 的代码。我将使用 Font Awesome 网站上的代码,因为这似乎是 Font Awesome 的问题,而不是 一定是我的网站:

引用 CSS 和图标的 HTML:

<link rel="stylesheet" href="../assets/css/site.css">
<link rel="stylesheet" href="../assets/css/pygments.css">
<link rel="stylesheet" href="../assets/font-awesome/css/font-awesome.css">
...
<div class="fa-hover col-md-3 col-sm-4">
   <a href="../icon/adjust"><i class="fa fa-adjust"></i> fa-adjust</a>
</div>

font-awesome.css内:

@font-face {
  font-family: 'FontAwesome';
  src: url('../fonts/fontawesome-webfont.eot');
  src: url('../fonts/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
  url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),
  url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');
  font-weight: normal;
  font-style: normal;
}

【问题讨论】:

  • 你能显示加载字体的代码部分吗?您是使用 CDN 还是从服务器本地加载它?您使用的是相对路径还是绝对路径?许多因素可能会导致从混合的 HTTP 和 HTTPS 源加载页面内容,并导致当主页面通过 HTTPS 加载时在 IE8 中获得的内容。
  • 已更新。如果您需要更多信息,请告诉我,但您也应该能够访问 Font Awesome 的网站并查看其来源。谢谢!
  • 所以另一个数据点。如果不是在@font-face 部分中使用相对 URL,而是使用硬编码的 http:// 路径,而不是 HTTPS 加载字体就好了(尽管有关于加载不安全内容的 IE 错误)但是如果我硬编码到 HTTPS 然后字体不加载。通过 HTTPS 请求 .eot 文件或至少以我的方式请求似乎存在一些问题。
  • 我有同样的问题,图标字体没有通过 HTTPS 在 IE8 中显示。 @tkeE2036,你有关于这个问题的更新吗?
  • 问题是在检索字体时发送的 Pragma: no-cache。从响应中删除它(对于提供字体真棒字体的端点),它应该可以解决问题。

标签: css http https internet-explorer-8 font-awesome


【解决方案1】:

实际的答案是,使用代理向浏览器隐藏返回给浏览器的任何缓存控制和编译指示:“no-cache”标头。 我像这样使用 nginx,将以下命令添加到 https 代理位置:

  proxy_hide_header Cache-Control;
  proxy_hide_header Pragma; 

here for details

【讨论】:

    【解决方案2】:

    在 web.xml 中添加 NoCacheHeaderFilter 并提供排除文件路径。

    <filter>
        <filter-name>NoCacheHeaderFilter</filter-name>
        <filter-class>NoCacheHeaderFilter</filter-class>
        <init-param>
            <param-name>exclude</param-name>
            <param-value>^/(image|css|js|fonts|lib|partials)/.*</param-value>
        </init-param>
    </filter>
    

    像这样添加过滤器。

        if (null != exclude) {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;
    
            String context = httpRequest.getContextPath();
            String path = httpRequest.getRequestURI().substring(context.length());
            if (!exclude.matcher(path).matches()) {
                httpResponse.setHeader("Pragma", "no-cache");
                httpResponse.setHeader("Cache-Control", "private, max-age=0, no-store, no-cache");
                httpResponse.setDateHeader("Expires", System.currentTimeMillis());
            }
        }
    
        chain.doFilter(request, response);
    

    【讨论】:

      【解决方案3】:

      这仅在 IE 中使用 https。

      从阻止缓存的相关文件中删除所有 HTTP 标头,例如

      Expires -1
      Pragma: no-cache
      

      删除这些文件的缓存控制后,您应该会看到您的图标。重新加载页面后,所有相关的 fontawesome 文件都应该显示 HTTP 代码 304,即文件来自浏览器缓存。

      【讨论】:

        【解决方案4】:

        我已确定问题并将发布答案,以防其他人遇到相同问题。问题在于我们与字体文件一起发送的 HTTP 缓存标头。显然这会导致 IE8 over HTTPS 由于某种原因无法加载字体(如果有人知道真正的原因,请在下面评论)。成功的标头应如下所示:

        HTTP/1.1 200 OK
        Content-Type: application/vnd.ms-fontobject
        Date: Wed, 26 Mar 2014 23:57:04 GMT
        ETag: "08b27bc96115c2d24350f0d09e6a9433f"
        Last-Modified: Wed, 26 Mar 2014 12:10:02 GMT
        Server: Apache-Coyote/1.1
        Content-Length: 38205
        Connection: keep-alive
        

        但是却是这样发送的:

        HTTP/1.1 200 OK
        **Cache-Control: max-age=31556926, must-revalidate
        Content-Type: application/vnd.ms-fontobject
        Date: Wed, 26 Mar 2014 23:58:06 GMT
        ETag: "08b27bc96115c2d24350f0d09e6a9433f"
        **Expires: Fri, 27 Mar 2015 05:46:52 GMT
        Last-Modified: Wed, 26 Mar 2014 12:12:12 GMT
        **Pragma: no-cache
        Server: Apache-Coyote/1.1
        **Set-Cookie: JSESSIONID=844B0798B373A3B8ED54A694C9DFB5C5; Path=/; Secure; HttpOnly
        Content-Length: 38205
        Connection: keep-alive
        

        【讨论】:

        • 仅适用于遇到此问题的任何人。它不是 Cache-Control 标头。如果将其设置为 no-cache,则会导致问题。我怀疑真正的问题在于Pragma: no-cache
        • 这个问题有什么解决办法吗?
        • 我有同样的问题,我谷歌了这个问题,但没有解决方案。欢迎任何想法!
        • 是的,在我的 https 网站上看到同样的问题。
        【解决方案5】:

        我也这么认为,

        与 Font Awesome over HTTPS 中的相对字体路径有关

        【讨论】:

          猜你喜欢
          • 2014-03-02
          • 2017-09-02
          • 2020-09-24
          • 2014-08-02
          • 2017-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-11
          相关资源
          最近更新 更多