ChatGPT解决这个技术问题 Extra ChatGPT

来自源的字体已被跨源资源共享策略阻止加载

我在几个 Chrome 浏览器上收到以下错误,但不是全部。目前尚不完全确定问题所在。

来自 https://ABCDEFG.cloudfront.net 的字体已被跨域资源共享策略阻止加载:请求的资源上不存在“Access-Control-Allow-Origin”标头。来源 https://sub.domain.example 因此不允许访问。

我在 S3 上有以下 CORS 配置

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedHeader>*</AllowedHeader>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

请求

Remote Address:1.2.3.4:443
Request URL:https://abcdefg.cloudfront.net/folder/path/icons-f10eba064933db447695cf85b06f7df3.woff
Request Method:GET
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Host:abcdefg.cloudfront.net
Origin:https://sub.domain.example
Pragma:no-cache
Referer:https://abcdefg.cloudfront.net/folder/path/icons-e283e9c896b17f5fb5717f7c9f6b05eb.css
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36

来自 Cloudfront/S3 的所有其他请求都能正常工作,包括 JS 文件。

我有同样的问题......升级到 chrome 37.0.2062.94 后我开始注意到它
更新 CORS 配置后,我重命名了资产并设法使其正常工作。因此,要么 1)CORS 配置仅应用于文件创建(不更新),要么 2)CORS 配置缓存在 Cloudfront 中。如果其他人可以确认它也适用于他们,我会将其作为答案发布。
刚刚注意到 Chrome v. 37.0.2062.94 但不是早期版本。我在 S3 上根本没有 CORS 配置,所以这不应该发生,对吧?
@Ghopper21 你需要正确的 CORS 配置。在 Firefox 中测试,这会给你(可能)相同的结果。
@RichPeck - 通过将正确的 CORS 配置添加到 S3 来修复(或者如果从源代码自动创建 CDN,那么它会更复杂一些 - 您必须添加适当的标头,然后使缓存的字体无效)... stackoverflow.com/questions/12229844/…有关更多详细信息,请参见下面的答案

S
Stephen Ostermiller

将此规则添加到您的 .htaccess

Header add Access-Control-Allow-Origin "*"

更好的是,正如@david thomas 所建议的,您可以使用特定的域值,例如

Header add Access-Control-Allow-Origin "your-domain.example"

嗨,与 Header set Access-Control-Allow-Origin "*" 有什么区别?谢谢
对于 Windows 用户,请在 web.config 文件中的 下设置 。祝你今天过得愉快
@Simone 的不同之处在于,使用“添加”响应标头被添加到现有的标头集中,即使该标头已经存在。这可能导致两个(或更多)标题具有相同的名称;而使用“set”设置响应标头,用此名称替换任何先前的标头。在这种情况下是相同的原因 * 包括它们全部。
只需注意 Access-Control-Allow-Origin "*" 可能是不安全的,因为它会打开域以允许来自任何域的 javascript 访问。您应该改用特定的域值,例如 Access-Control-Allow-Origin "http://example1.com" 另请参阅 stackoverflow.com/a/10636765/583715 以获得很好的解释。
你是我的救星!
C
Community

自 2014 年 9 月/10 月以来的 Chrome 使字体接受与 Firefox 所做的相同的 CORS 检查https://code.google.com/p/chromium/issues/detail?id=286681https://groups.google.com/a/chromium.org/forum/?fromgroups=#!topic/blink-dev/TT9D5-Zfnzw 中对此进行了讨论

鉴于对于字体,浏览器可能会执行 preflight check,那么您的 S3 策略 needs the cors request header as well。您可以在 Safari(目前不执行 CORS 检查字体)和 Firefox(执行)中检查您的页面,以仔细检查这是所描述的问题。

有关 Amazon S3 CORS 的详细信息,请参阅 Amazon S3 CORS (Cross-Origin Resource Sharing) and Firefox cross-domain font loading 上的堆栈溢出答案。

一般注意,因为这曾经仅适用于 Firefox,因此搜索 Firefox 而不是 Chrome 可能会有所帮助。


感谢您的回答,看来这对许多其他人来说可能是个问题。尽管我的问题发生在 Chrome 的稳定版本中。
这正在 Chrome 中发生。
随着人们(包括我自己!)不断提到这个答案,我已经使它不那么具有历史意义,并且与当今更相关。
另外仅供参考,我发现一条错误消息“已被跨域资源共享策略阻止加载:请求的资源上不存在'Access-Control-Allow-Origin'标头。来源”实际上与错误有关我的原始服务器中字体文件的路径,然后 cloudfront 重定向到我的服务器的主页(并且重定向响应或主页没有 CORS 标头)。令人困惑,但通过使用实际字体文件的正确路径来解决(严格来说,不是 CORS 问题)。
嘿@DallasClark,您可能想为您的问题选择一个可接受的答案。谢谢蒂姆,您的链接和解释对我的经验很有帮助。干杯。
Ö
Özer

我只需将 <AllowedMethod>HEAD</AllowedMethod> 添加到 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>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

不过不确定安全性,如果有人对此有一些意见会很好..
这种变化需要时间来传播吗?我刚刚在存储桶的 CORS 政策中添加了 <AllowedMethod>HEAD</AllowedMethod>,但它仍然无法正常工作。
通常不,它应该采取最大。几分钟
Y
Yaniv Vova Alterman

Nginx:

location ~* \.(eot|ttf|woff)$ {
   add_header Access-Control-Allow-Origin '*';
}

AWS S3:

选择您的存储桶单击右上角的属性 Permisions => Edit Cors Configuration => Save Save

http://schock.net/articles/2013/07/03/hosting-web-fonts-on-a-cdn-youre-going-to-need-some-cors/


添加后,找不到404。
b
bashaus

2014 年 6 月 26 日,AWS 在 CloudFront 上发布了适当的 Vary: Origin 行为,所以现在您只需

为您的 S3 存储桶设置 CORS 配置:

<AllowedOrigin>*</AllowedOrigin>

在 CloudFront -> Distribution -> Behaviors for this origin 中,使用 Forward Headers: Whitelist 选项并将“Origin”标头列入白名单。

在 CloudFront 传播新规则时等待约 20 分钟

现在,您的 CloudFront 分配应该为不同的客户端 Origin 标头缓存不同的响应(使用适当的 CORS 标头)。


这似乎不起作用,您有更多详细信息吗?我启用了这个,但我仍然遇到完全相同的问题。
L
Luigi04

唯一对我有用的东西(可能是因为我与 www. 用法不一致):

将此粘贴到您的 .htaccess 文件中:

<IfModule mod_headers.c>
<FilesMatch "\.(eot|font.css|otf|ttc|ttf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
<IfModule mod_mime.c>
# Web fonts
AddType application/font-woff woff
AddType application/vnd.ms-fontobject eot

# Browsers usually ignore the font MIME types and sniff the content,
# however, Chrome shows a warning if other MIME types are used for the
# following fonts.
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf

# Make SVGZ fonts work on iPad:
# https://twitter.com/FontSquirrel/status/14855840545
AddType     image/svg+xml svg svgz
AddEncoding gzip svgz

</IfModule>

# rewrite www.example.com → example.com

<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>

http://ce3wiki.theturninggate.net/doku.php?id=cross-domain_issues_broken_web_fonts


由于您的代码很详细,因此我花了一些时间来完成它,但我学到的东西很少。我应用它的一部分来调整我的解决方案。有效。
a
agbodike

我有同样的问题,这个链接为我提供了解决方案:

http://www.holovaty.com/writing/cors-ie-cloudfront/

它的简短版本是:

编辑 S3 CORS 配置(我的代码示例没有正确显示) 注意:这已经在原始问题中完成 注意:提供的代码不是很安全,链接页面中的更多信息。转到分发的“行为”选项卡,然后单击以编辑将“转发标头”从“无(改进缓存)”更改为“白名单”。将“Origin”添加到“Whitelist Headers”列表中保存更改

您的云端分发将更新,这大约需要 10 分钟。之后,一切都会好起来的,您可以通过检查与 CORS 相关的错误消息是否已从浏览器中消失来进行验证。


n
nu everest

对于那些使用带有 web.config 文件的 Microsoft 产品的用户:

将其与您的 web.config 合并。

允许在任何域上将 value="domain" 替换为 value="*"

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webserver>
    <httpprotocol>
      <customheaders>
        <add name="Access-Control-Allow-Origin" value="domain" />
      </customheaders>
    </httpprotocol>
  </system.webserver>
</configuration>

如果您没有编辑 web.config 的权限,请在您的服务器端代码中添加此行。

Response.AppendHeader("Access-Control-Allow-Origin", "domain");

值得一票记住我们 Windows 用户。
我正在使用 asp.net 核心,如何将其添加到 appsettings.json 文件中?
W
Webucator

对于 AWS S3,将跨域资源共享 (CORS) 设置为以下对我有用:

[
    {
        "AllowedHeaders": [
            "Authorization"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

"AllowedOrigins": ["*"] <--- 这真的很痛!
@andreas,如果您关心其他网站是否加载此内容,这不只是一个问题吗?或者我错过了什么更危险的东西?
不是我知道的。但这确实是一种不好的做法,如果其他人使用您的图像,可能会导致您付出意想不到的代价。如果您的 S3 存储桶前面有 CloudFront,这可能会变得很昂贵。
M
Michael Cole

有一篇很好的文章 here

在 nginx/apache 中配置它是一个错误。如果您使用的是托管公司,则无法配置边缘。如果您使用的是 Docker,则该应用程序应该是自包含的。

请注意,某些示例使用 connectHandlers 但这仅在文档上设置标题。使用 rawConnectHandlers 适用于所有提供的资产(字体/css/等)。

  // HSTS only the document - don't function over http.  
  // Make sure you want this as it won't go away for 30 days.
  WebApp.connectHandlers.use(function(req, res, next) {
    res.setHeader('Strict-Transport-Security', 'max-age=2592000; includeSubDomains'); // 2592000s / 30 days
    next();
  });

  // CORS all assets served (fonts/etc)
  WebApp.rawConnectHandlers.use(function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    return next();
  });

这将是查看 browser policy 之类的框架等的好时机。


3
3 revs, 3 users 92%

聚会迟到了,但我刚刚遇到了这个问题,并在我的 AWS 存储桶配置(权限选项卡)中使用以下设置解决了这个问题。请求的格式不再是 XML,而是 JSON:

[
    {
        "AllowedHeaders": [
            "Content-*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "https://www.yourdomain.example",
            "https://yourdomain.example"
        ],
        "ExposeHeaders": []
    }
]

D
Daksh Patel

如果您使用 node.js 作为服务器,只需在您的中添加使用源...

像这样

  app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  next();
});

我们需要原产地响应


R
Raghav

如果要允许特定域的文件夹中的所有字体,则可以使用以下命令:

  <location path="assets/font">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="http://localhost:3000" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>

其中 assets/font 是所有字体所在的位置, http://localhost:3000 是您要允许的位置。


I
Ivan Rubinson

heroku 的工作解决方案在这里http://kennethjiang.blogspot.com/2014/07/set-up-cors-in-cloudfront-for-custom.html(引用如下):

如果您在 Heroku 中运行 Rails 应用程序并使用 Cloudfront 作为 CDN,那么下面就是您可以执行的操作。它在 Ruby 2.1 + Rails 4、Heroku Cedar 堆栈上进行了测试。

将 CORS HTTP 标头 (Access-Control-*) 添加到字体资源

将 gem font_assets 添加到 Gemfile 。

捆绑安装

添加 config.font_assets.origin = '*' 到 config/application.rb 。如果您想要更精细的控制,您可以将不同的原始值添加到不同的环境,例如 config/config/environments/production.rb

curl -I http://localhost:3000/assets/your-custom-font.ttf

将代码推送到 Heroku。

配置 Cloudfront 以转发 CORS HTTP 标头

在 Cloudfront 中,选择您的发行版,在“行为”选项卡下,选择并编辑控制您的字体交付的条目(对于大多数简单的 Rails 应用程序,您在这里只有 1 个条目)。将转发标题从“无”更改为“Whilelist”。并将以下标头添加到白名单:

Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Max-Age

保存它,就是这样!

警告:我发现有时即使 CORS 错误消失,Firefox 也不会刷新字体。在这种情况下,请不断刷新页面几次,以使 Firefox 相信您真的下定决心。


请避免仅链接的答案。如果您可以将链接文章中的相关片段复制到您的答案中,这将很有帮助。谢谢。