Firefox WebFont 403 尽管有 S3 CORS 规则

Posted

技术标签:

【中文标题】Firefox WebFont 403 尽管有 S3 CORS 规则【英文标题】:Firefox WebFont 403 Despite S3 CORS Rules 【发布时间】:2013-07-20 16:42:42 【问题描述】:

我正在尝试从 AWS S3 在 heroku 上为我的 django 项目托管和提供 webfonts(特别是 fontawesome),但我很难克服可怕的 firefox cross-domain font-loading issue。我已经尝试了所有记录在案的、公认的解决方案,但没有一个对我有用。

我经常看到的推荐解决方案是在我的 S3 存储桶上编辑 CORS 配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>https://myapp.herokuapp.com</AllowedOrigin>
        <AllowedOrigin>https://www.myapp.herokuapp.com</AllowedOrigin>
        <AllowedOrigin>https://myapp.com</AllowedOrigin>
        <AllowedOrigin>https://www.myapp.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
   </CORSRule>
</CORSConfiguration>

我已经尝试了这些设置的不同变体,Firefox 仍然给我一个来自https://www.myapp.com 禁止的 HTTP 403:

Request URL: https://my_bucket.s3.amazonaws.com/css/fontawesome-webfont-webfont.ttf
Request Method: GET
Status Code: HTTP/1.1 403 Forbidden

通过该 HTTP 请求,我在响应标头中收到“Access-Control-Allow-Credentials:true”。

我需要为 Firefox 声明另一个 CORS 规则以接受来自 S3 的字体吗?当我 curl font-awesome 我没有得到/看到任何有助于解决这个问题的东西:

> https://s3.amazonaws.com/my_bucket/font/fontawesome-webfont.eot
* About to connect() to s3.amazonaws.com port 443 (#0)
*   Trying xxx.xx.xx.xxxx... connected
* Connected to s3.amazonaws.com (xxx.xx.xx.xxx) port 443 (#0)
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using DES-CBC3-SHA
* Server certificate:
*       subject: C=US; ST=Washington; L=Seattle; O=Amazon.com Inc.; CN=s3.amazonaws.com
*       start date: 2010-10-08 00:00:00 GMT
*       expire date: 2013-10-07 23:59:59 GMT
*          common name: s3.amazonaws.com (matched)
*       issuer: C=US; O=VeriSign, Inc.; OU=VeriSign Trust Network; OU=Terms of use at https://www.verisign.com/rpa (c)09; CN=VeriSign Class 3 Secure Server CA - G2
*       SSL certificate verify ok.
> GET /my_bucket/font/fontawesome-webfont.eot HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: s3.amazonaws.com
> Accept: */*
> Origin: https://www.myapp.com
>
< HTTP/1.1 200 OK
< x-amz-id-2: XxMCWhqMsTGMMmAQnSHT/+RO7aluQSRyZ5wTAseMKM5cpavE+NkBQCuD8ykiIIDE
< x-amz-request-id: 90FF2C1C85254815
< Date: Mon, 22 Jul 2013 01:54:53 GMT
< Access-Control-Allow-Origin: https://www.myapp.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
< Last-Modified: Mon, 22 Jul 2013 01:44:31 GMT
< ETag: "455808250694e5760bd92b3ce1f070b6"
< Accept-Ranges: bytes
< Content-Type: application/octet-stream
< Content-Length: 25395
< Server: AmazonS3
<
3cOb?LP&?S~FontAwesomeRegular"Version 1.00 2012&FontAwesome RegularBSGPɴbGbKV?????Y?D

是否有另一种设置 Access-Control-Allow-Origin 的方法可以使其正常工作?

【问题讨论】:

我遇到了同样的问题,想知道您是否找到了解决方法。 您的配置看起来不错。在两个示例中,您显示的 URL 不一样,您确定您请求的文件名正确吗? 【参考方案1】:

如果您在存储桶策略中限制对特定 HTTP 引荐来源网址的访问,请将您的存储桶网址也添加到引荐来源网址列表中。例如:

"Condition": 
    "StringLike": 
        "aws:Referer": [
            "http://my_bucket.s3.amazonaws.com/*",
            "https://my_bucket.s3.amazonaws.com/*",
            "http://www.example.com/*",
            "https://www.example.com/*",
        ]
    

检查 Firefox 中的响应标头。原来字体的引用者是您的 CSS 文件,它托管在 s3 存储桶上,而不是您的域。

【讨论】:

你是救生员!

以上是关于Firefox WebFont 403 尽管有 S3 CORS 规则的主要内容,如果未能解决你的问题,请参考以下文章

Webfont 在 Internet Explorer 中不起作用

Amazon S3 中的 403 禁止问题

尽管我有管理员权限,但 Spring Boot 返回 403

创建一个跨浏览器图标 webfont

Amazon S3 - 尽管有 GetObject 限制,但返回 403 错误而不是 404

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应