目前已经与Firefox不从不同来源比当前网页字体加载一个长期存在的问题。 通常情况下,当字体上的CDN服务出现的问题。
各种解决方案已经提出的其他问题:
CSS @字体面不与Firefox的工作,但随着Chrome和IE工作
通过引入亚马逊S3 CORS的,有没有使用CORS来解决Firefox中的字体加载问题的解决方案?
编辑:这将是巨大看到S3 CORS配置的样本。
EDIT2:我发现实际上不理解什么是做了工作的解决方案。 如果有人可以提供有关CONFIGS和对配置的亚马逊的解释发生的背景魔术更详细的解释,这将不胜感激,与nzifnab谁把一个赏金它。
Answer 1:
更新2014年9月10日:
你不应该需要做下面的任何查询字符串黑客的了,因为正确的Cloudfront支持CORS现在。 见http://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/和这个答案详细信息: https://stackoverflow.com/a/25305915/308315
OK,我终于用下面从文档中示例的小调整的配置工作的字体。
我的字体托管在S3,而是通过CloudFront的门前。
我不知道为什么它的作品,我的猜测是可能的是, <AllowedMethod>
GET
和<AllowedHeader>
Content-*
是必要的。
如果有人精通亚马逊S3 CORS配置可以在此提供一些线索灯,它会不胜感激。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://mydomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://*.mydomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Content-*</AllowedHeader>
<AllowedHeader>Host</AllowedHeader>
</CORSRule>
</CORSConfiguration>
编辑:
一些开发商面临高速缓存的Cloudfront的问题Access-Control-Allow-Origin
头。 此问题已通过在链接的AWS工作人员安排( https://forums.aws.amazon.com/thread.jspa?threadID=114646 )以下时,通过@杰夫·阿特伍德评论。
从联线,建议,作为一种解决方法,使用查询字符串 ,从不同的域调用之间的区别。 我会在这里重现缩短的例子。
使用curl
检查响应头:
域A:a.domain.com
curl -i -H "Origin: https://a.domain.com" http://hashhashhash.cloudfront.net/font.woff?https_a.domain.com
从域A响应报头:
Access-Control-Allow-Origin: https://a.domain.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
X-Cache: Miss from Cloudfront
域B:b.domain.com
curl -i -H "Origin: http://b.domain.com" http://hashhashhash.cloudfront.net/font.woff?http_b.domain.com
从域B响应标头:
Access-Control-Allow-Origin: http://b.domain.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
X-Cache: Miss from Cloudfront
你会发现在Access-Control-Allow-Origin
返回不同的值,这得到了过去的Cloudfront缓存。
Answer 2:
一些调整之后,我似乎已经得到了这个没有查询字符串破解工作。 更多资讯: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorS3Origin.html#RequestS3-cors
我要通过我的整个安装,这样很容易看到我做了什么,希望这可以帮助别人。
背景资料:我使用的是具有asset_sync宝石把资产S3上一个Rails应用程序。 这包括字体。
在S3控制台,我点击了我的水桶,性能和“编辑CORS配置”,在这里:
textarea的里面我有这样的:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://*.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
然后内的Cloudfront面板( https://console.aws.amazon.com/cloudfront/home )我创建的分布,补充,指向我的S3桶的原点
然后添加了一个默认的路径指向基于S3原点我设置一个行为。 我也做了点击白名单头和补充Origin
:
现在会发生什么是下面的,我相信这是正确的:
1)检查S3标头被设定正确
curl -i -H "Origin: https://example.com" https://s3.amazonaws.com/xxxxxxxxx/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
x-amz-id-2: Ay63Qb5uR98ag47SRJ91+YALtc4onRu1JUJgMTU98Es/pzQ3ckmuWhzzbTgDTCt+
x-amz-request-id: F1FFE275C0FBE500
Date: Thu, 14 Aug 2014 09:39:40 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Content-Type: application/x-font-ttf
Content-Length: 12156
Server: AmazonS3
2)检查的Cloudfront的工作原理与头
curl -i -H "Origin: https://example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 09:35:26 GMT
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 77bdacfea247b6cbe84dffa61da5a554.cloudfront.net (CloudFront)
X-Amz-Cf-Id: cmCxaUcFf3bT48zpPw0Q-vDDza0nZoWm9-_3qY5pJBhj64iTpkgMlg==
(注意:上述是从CloudFront的一个小姐,因为这些文件缓存180秒,但同样正在研究命中)
在- 3)不同来源(而且是一个允许在CORS的S3桶)CloudFront的命中Access-Control-Allow-Origin
是不缓存! 好极了!
curl -i -H "Origin: https://www2.example.com" https://xxxxx.cloudfront.net/assets/fonts/my-cool-font.ttf
HTTP/1.1 200 OK
Content-Type: application/x-font-ttf
Content-Length: 12156
Connection: keep-alive
Date: Thu, 14 Aug 2014 10:02:33 GMT
Access-Control-Allow-Origin: https://www2.example.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Access-Control-Allow-Credentials: true
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=180
Last-Modified: Mon, 09 Dec 2013 14:29:04 GMT
ETag: "98918ee7f339c7534c34b9f5a448c3e2"
Accept-Ranges: bytes
Server: AmazonS3
Vary: Origin
X-Cache: Miss from cloudfront
Via: 1.1 ba7014bad8e9bf2ed075d09443dcc4f1.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vy-UccJ094cjdbdT0tcKuil22XYwWdIECdBZ_5hqoTjr0tNH80NQPg==
注意:上面说的域名已经没有查询字符串黑客成功地改变了。
当我改变了Origin标,似乎永远是一个X-Cache: Miss from cloudfront
第一个请求,然后后来我得到预期的X-Cache: Hit from cloudfront
PS值得注意的是,这样做卷曲-I(大写I)时将不会显示访问控制允许来源标题,因为它只有一个头,我做-i使它成为一个GET和向上滚动。
Answer 3:
我的字体被送达正确直到最后推Heroku的...我不知道为什么,但在CORS通配符允许起源停止工作。 我说我所有的原初和亲域的CORS政策在桶设定所以现在看起来是这样的:
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>http://prepro.examle.com</AllowedOrigin>
<AllowedOrigin>https://prepro.examle.com</AllowedOrigin>
<AllowedOrigin>http://examle.com</AllowedOrigin>
<AllowedOrigin>https://examle.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
更新:添加您http://localhost:PORT
太
Answer 4:
那么,文档指出,你可以坚持的配置为“你的水桶的CORS子资源。” 我把这个意思我想创建一个在我的桶的配置的根被称为“CORS”的文件,但是这是行不通的。 最后,我不得不登录到Amazon S3的行政区域和内添加配置properties
我斗的对话框。
S3可以使用一些更好的文档...
Answer 5:
就我而言,我还没有定义的CORS配置XML命名空间和版本。 定义这些工作。
变
<CORSConfiguration>
至
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
Answer 6:
有一个更好,更简单的方式!
我个人比较喜欢用我的DNS子域来解决这个问题。 如果我的CDN的背后是cdn.myawesomeapp.com而不是sdf73n7ssa.cloudfront.net然后浏览器不会freakout并阻止他们为跨域安全问题。
要指向你的子域名您的AWS的Cloudfront域去AWS的Cloudfront控制面板中,选择您的Cloudfront分布并输入您的CDN子域到备用域名(CNAME记录)字段。 像cdn.myawesomeapp.com的东西就行了。
现在你可以去你的DNS提供商(如AWS路线53)和cdn.myawesomeapp.com指向sdf73n7ssa.cloudfront.net创建CNAME。
http://blog.cloud66.com/cross-origin-resource-sharing-cors-blocked-for-cloudfront-in-rails/
Answer 7:
此配置为我工作。 我可以列出对象,检索,更新和删除。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
<ExposeHeader>x-amz-meta-custom-header</ExposeHeader>
</CORSRule>
</CORSConfiguration>
Answer 8:
在亚马逊S3 CORS配置 (S3桶/许可/ CORS)如果你使用这样的:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
CORS行之有效的JavaScript和CSS文件,但它不会对字体文件。
您必须指定域中使用在@VKen答案表达模式CORS允许: https://stackoverflow.com/a/25305915/618464
所以,使用此 :
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>https://*.mydomain.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
记得替换“mydomain.com”为您的域名。
在此之后, 无效CloudFront的缓存 (CloudFront的/失效通知/创建失效),它会工作。
Answer 9:
<ifModule mod_headers.c>
Header set Access-Control-Allow-Origin: http://domainurl.com
</ifModule>
简单的解决方案
Answer 10:
重新启动我的春天启动的应用程序(服务器)解决了这个问题对我来说。
我曾在S3配置正确CORS。 卷曲是给原产头正确的响应。 Safari浏览器被正确读取的字体。 这只是谁是不是愿意接受CORS的镶边。
不知道究竟是什么导致了行为。 一定有什么做的If-Modified-自
Answer 11:
当然是。 Firefox支持CORS字体,就像规范要求在http://dev.w3.org/csswg/css3-fonts/#allowing-cross-origin-font-loading
Answer 12:
我经历了同样的问题。 我没有一个CNAME添加到我的CDD避免跨域问题...我只是不得不做以下几点:
转到您的桶属性 - >权限 - >添加更多的权限 - >承授人:每个人,并检查“列表”选项。
这是一个图形的例子。 http://i.stack.imgur.com/KOEwy.png
希望充分这将是有用的人。
文章来源: Amazon S3 CORS (Cross-Origin Resource Sharing) and Firefox cross-domain font loading