@ font-face EOT不通过HTTPS加载

概要

我在IE 7,8,9上使用@ font-face通过HTTPS遇到了一个问题 – 它只是不加载。 包含HTML页面是否托pipe在HTTPS上并不重要, 当我尝试通过HTTP载入EOT字体时,HTTPS不会 。 有没有人看过这种行为?

托pipe字体的服务器发送正确的content-type =“application / vnd.ms-fontobject”

我已经尝试了多种字体,所以它不是特定于字体的。

字体是在字体松鼠生成的

CSS语法

@font-face { font-family: 'GothamCondensedBold'; src:url('path/to/fontgothmbcd-webfont.eot'); src:url('path/to/fontgothmbcd-webfont.eot?#iefix') format('embedded-opentype'), url('path/to/fontgothmbcd-webfont.woff') format('woff'), url('path/to/fontgothmbcd-webfont.ttf') format('truetype'), url('path/to/fontgothmbcd-webfont.svg#GothamCondensedBold') format('svg'); font-weight: normal; font-style: normal; } 

示例页面

http://gregnettles.net/dev/font-face-test.html

我知道这是一个古老的线程,但我不得不权衡。在所有版本的Internet Explorer(7-11)没有通过HTTPS加载EOT和WOFF字体。 经过数小时的试验和错误,并将我们的标题与其他工作网站进行比较,我们发现它是各种各样的标题,搞乱了事情。 取消设置这些文件types的头文件可以立即解决我们的问题。

 <FilesMatch "\.(woff)$"> Header unset Vary </FilesMatch> <FilesMatch "\.(eot)$"> Header unset Vary </FilesMatch> 

我遇到了这个HTTPS的问题,但不是HTTP。 出于某种原因,IE将继续通过不同的字体选项,忽略200 OK响应。

在我的情况下,问题是HTTP头Cache-Control: no-cache的字体。 虽然这可以正常工作与HTTP,通过HTTPS它会导致Internet Explorer忽略下载的字体。

我最好的猜测是这是这种行为的变化: http : //support.microsoft.com/kb/815313

因此,如果您通过Developer Toolsnetworking视图中的每种字体看到IE工作正常,则可能需要检查是否有Cache-Control标头并将其删除。

这通常是由于在下载.woff或.eot文件时响应标题。

  • Cache-Control = no-cache,no-store,max-age = 0,必须重新validation
  • Pragma = no-cache

在我的情况下,我正在使用弹簧引导,并删除这些头我不得不做下列。 也解决了这个问题。

 public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.headers().defaultsDisabled() .addHeaderWriter(new StaticHeadersWriter("Cache-Control"," no-cache,max-age=0, must-revalidate")) .addHeaderWriter(new StaticHeadersWriter("Expires","0")); } } 

我似乎记得某些版本的IE不能使用托pipe在网站域外的@fontface字体(如果页面位于http://a.domain.tld/page.html – 字体也必须位于http:// a .domain.tld / )由于某种原因。 把EOT文件放在你的域名上,然后再试一次。

IE9阻止跨网站字体的下载

如果没有caching标题,我注意到Windows Vista上的IE9客户端仍然不加载字体(即使在IE9仿真模式下我的新开发机器IE11也是如此)。

我能够通过以下方式在Internet Explorer中的客户端计算机上解决问题:

  • 互联网选项
  • 高级
  • 安全

并取消选中“不要将encryption的页面保存到磁盘”选项。

HTH

Apache / 2.2.15的工作解决scheme是添加.htaccess

 <FilesMatch "\.(woff)$"> Header unset Cache-control </FilesMatch> <FilesMatch "\.(eot)$"> Header unset Cache-control </FilesMatch> 

您是否尝试通过https直接下载EOT文件? SSL证书似乎不好(不匹配),这可能是你的问题。

您还应该确保为这些文件设置了跨域策略,但这可能不是此问题的一个因素,可能会导致某些浏览器出现问题。

这听起来像是你的CDN的一个问题。 您可以通过更改您的主机文件来validation这一点,让您的SSL域指向您的非SSLstream量所服务的任何IP。 如果字体呈现,你需要调用你的CDN,并找出他们的服务器正在做的字体文件。

这是我的修复:

使用IIS的URL重写插件为所有EOT文件设置Cache-Control标题:

 <system.webServer> .... <rewrite> <outboundRules> <rule name="Fix IE9 missing font icons"> <match serverVariable="RESPONSE_Cache_Control" pattern=".*" /> <conditions> <add input="{REQUEST_URI}" pattern="\.eot.*" /> </conditions> <action type="Rewrite" value="private, max-age=36000" /> </rule> </outboundRules> </rewrite> </system.webServer> 

我面对类似的问题,但这是罪魁祸首Vary头。 在我的设置中,我正在使用Ruby on Rails与rack-corsgem。 这是给字体文件Vary: Origin的头。 要解决这个问题,你可以设置标题为Accept-Encoding ,在这里设置中间件:

 config.middleware.insert_before 0, "Rack::Cors", :debug => true, :logger => (-> { Rails.logger }) do allow do origins '*' resource '/cors', :headers => :any, :methods => [:post], :credentials => true, :max_age => 0 resource '*', :headers => :any, :methods => [:get, :post, :delete, :put, :options, :head], :max_age => 0, vary: ['Accept-Encoding'] # Required or IE11 fonts will break end end 

使用https:// …尝试完整url。 由于https的放大和解压缩文件比较慢,因此有一些技巧可以提供混合的http / https内容,而不会收到“不安全的内容”警告。 你可能会search它们。 从来没有需要使用这样的技巧。

好吧,据我所知这是一个IE8的错误。 我创build了一个解决方法,至less在Apache上工作 – 使用mod_rewrite强制HTTP以“.eot”或“.eot?”结尾的请求 并为所有其他请求强制使用HTTPS。 在.htaccess文件中,执行:

 <IfModule mod_rewrite.c> RewriteEngine on # if HTTPS request, force to HTTP if file ends in '.eot' or '.eot?' RewriteCond %{SERVER_PORT} 443 RewriteCond %{REQUEST_URI} ^.*\.eot\??$ RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # if HTTP request, force to HTTPS if file does NOT end in '.eot' or '.eot?' RewriteCond %{SERVER_PORT} 80 RewriteCond %{REQUEST_URI} !.*\.eot\??$ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule> 

不完全漂亮,我相信它增加了一些服务器开销,运行string比较每一个请求,但它修复了这个问题:)

嗨,我刚刚遇到同样的问题,我find了一个修复,希望这可以帮助别人。

这是一个IE <= 8的错误评论。 您可以在https://communities.bmc.com/thread/88899查看有关此问题的一些信息。; 基本上问题是下载一个文件在IE浏览器通过HTTPS与高速caching:没有caching头被设置,请尝试删除caching头,看看是否是你的问题。

这个答案也可以帮助IE:无法从*下载*。 无法打开此Internet站点。 请求的网站不可用或无法find

希望分享我的情况和解决scheme,希望能帮助下一个人。

我的字体通过Amazon CloudFront通过HTTPS提供,该CloudFrontconfiguration为从位于Elastic Load Balancer后面的应用程序提供静态资产。

字体有以下标题:

 Access-Control-Allow-Origin: * Cache-Control: public, max-age=100000 Cache-Control: no-cache="set-cookie" 

基于其他答案和我可以在网上find的东西,我会预料到这个工作,因为它是设置一个max-age并有适当的CORSconfiguration。 但是,IE9仍然不会呈现字体。

问题原来是Cache-Control: no-cache="set-cookie"头,这让我感到吃惊,因为那只是说不cachingSet-Cookie头(除非我错了)。

我花了一段时间才弄清楚标题是从哪里来的。 这个头文件被我们的ELB添加了,因为我们通过cookie使用了粘性会话,而且我认为负载平衡器被configuration为当它被设置的时候使用这个Cache-Control头文件。

所以closures粘性会话删除标题,并导致字体呈现。 我们可以closuresHTTP请求的粘性会话,并将它们留在HTTPS请求上,这很好,因为我们强制使用任何非静态资产的SSL,但很高兴将静态资产提供给使用或不使用SSL的CloudFront。

希望别人能find这个有用的信息。

相当古老的问题,但我认为没有人回答正确。 问题是字体已经从另一个文件加载,对我来说,这似乎是Access-Controll-Allow-Origin的情况。

它的工作非常有效,请在虚拟主机文件或.htaccess中添加以下内容:

 <ifModule mod_headers.c> Header set Access-Control-Allow-Origin: * </ifModule> 

并重新启动Apache

现在,通过将以下条目添加到Apache服务器中的httpd.conf或.htaccess中,可以解决此问题。

为了得到它的工作,我们已经从使用FilesMatch改为LocationMatch,现在正在设置标题完美。

要为字体文件设置正确的mimetypes,请将这些行添加到config:

  AddType application/vnd.ms-fontobject .eot AddType font/truetype .ttf AddType font/opentype .otf AddType font/opentype .woff AddType image/svg+xml .svg .svgz 

要更新字体文件标题,此修复程序完美工作,以在IE浏览器中呈现字体图标。

 <LocationMatch "\.(eot|otf|woff|ttf)$"> Header unset Cache-Control Header unset no-store </LocationMatch >