元のフォントは、クロスオリジンリソースシェアリングポリシーによってロードがブロックされています


159

一部のChromeブラウザーで次のエラーが表示されますが、すべてではありません。この時点で問題が何であるかは完全にはわかりません。

元のフォント「https://ABCDEFG.cloudfront.net」は、クロスオリジンリソース共有ポリシーによってロードがブロックされました:リクエストされたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' https://sub.domain.com 'はアクセスを許可されません。

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.com
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

JSファイルを含め、Cloudfront / S3からの他のすべてのリクエストは適切に機能します。


5
同じ問題が発生しています... Chrome 37.0.2062.94にアップグレードした後、気づき始めました
カーリー

CORS構成を更新した後、私はアセットの名前を変更し、なんとか機能させることができました。したがって、1)CORS構成がファイルの作成のみに適用される(更新ではない)、または2)CORS構成がCloudfrontにキャッシュされる。他の人もそれが彼らのために働くことを確認できるならば、私はこれを答えとして投稿します。
ダラスクラーク

1
Chrome v。37.0.2062.94でこれに気づきましたが、以前のバージョンではありませんでした。S3にはCORS構成がまったくないので、これは起こらないはずですよね?
Ghopper21

1
@ Ghopper21あなたは正しいCORS設定が必要です。Firefoxでテストすると、(おそらく)同じ結果が得られます。
Tim Diggins、2014

1
@RichPeck-正しいCORS構成をS3に追加することで修正します(またはソースからCDNを自動的に作成する場合は、少し複雑です-適切なヘッダーを追加してから、キャッシュされたフォントを無効にする必要があります)... stackoverflow.com / questions / 12229844 /…詳細については、以下の回答を参照してください
Tim Diggins 14

回答:


87

このルールを.htaccessに追加します

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

@david thomasによって提案されているように、特定のドメイン値を使用できます。

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

1
こんにちは、どう違いHeader set Access-Control-Allow-Origin "*"ますか?ありがとう
NineCattoRules

8
Windowsユーザーの場合は、web.configファイルの<customHeaders>で<add name = "Access-Control-Allow-Origin" value = "*" />を設定します。良い一日を
アーサランサリーム2015

2
@Simoneの違いは、 "add"を使用すると、このヘッダーが既に存在する場合でも、応答ヘッダーが既存のヘッダーセットに追加されることです。これにより、2つ(またはそれ以上)のヘッダーが同じ名前になることがあります。一方、 "set"を指定すると、応答ヘッダーが設定され、以前のヘッダーがこの名前に置き換えられます。この場合、同じ原因です*すべてを含みます。
Giovanni Di Gregorio

@GiovanniDiGregorio素敵な情報をありがとう!
NineCattoRules

21
Access-Control-Allow-Origin "*"ドメインを開いて任意のドメインからのJavaScriptアクセスを許可するため、注意するだけでは安全ではない可能性があります。代わりに特定のドメイン値を使用する必要があります。たとえば 、適切な説明については、stackoverflow.com / a / 10636765/583715Access-Control-Allow-Origin "http://example1.com"も参照してください。
デビッドトーマス

58

2014年9月10日以降のChromeでは、Firefoxがhttps://code.google.com/p/chromium/issues/detail?id=286681を実行したのと同じCORSチェックがフォントに適用されます。これに関する議論はhttps://groups.google.com/a/chromium.org/forum/?fromgroups=#!topic/blink-dev/TT9D5-Zfnzwにあります

フォントの場合、ブラウザがプリフライトチェックを行う場合があるため、 S3ポリシーにはcorsリクエストヘッダーも必要です。たとえば、Safari(現時点ではフォントのCORSチェックを行わない)やFirefox(そうする)でページをチェックして、これが説明されている問題であることを再確認できます。

Amazon S3 CORSの詳細については、Amazon S3 CORS(クロスオリジンリソースシェアリング)のスタックオーバーフローの回答とFirefoxのクロスドメインフォントの読み込みをご覧ください。

これは通常、Firefoxにのみ適用されていたため、ChromeではなくFirefoxを検索すると役立つ場合があります。


この回答に感謝します。他の多くの人にとって問題になる可能性があります。私の問題はChromeの安定したビルドで発生していましたが。
ダラスクラーク

45
これは現在Chromeで発生しています。
justingordon 2014

人々がこの答えを(私も含めて!)言及し続けているので、私はそれをより歴史的でなく、今日との関連性を高めました。
Tim Diggins、2015年

1
また、エラーメッセージ「クロスオリジンリソースシェアリングポリシーによってロードがブロックされています:リクエストされたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。オリジン」は、実際には不良であることが原因であることがわかりました元のサーバーのフォントファイルへのパス、およびCloudfrontはサーバーのホームページにリダイレクトします(リダイレクトレスポンスまたはホームページにはCORSヘッダーがありませんでした)。混乱しますが、実際のフォントファイルへの正しいパスを使用することで解決されます(厳密には、CORSの問題ではありません)。
Tim Diggins、2015年

@DallasClark様、質問に対して承認された回答を選択してください。ティムに感謝します。あなたのリンクと説明は私の経験に役立ちました。乾杯。
Dan

46

<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>

ただし、セキュリティについてはよくわからないので、誰かがそれについて何か入力があればいいのですが。
ÖzerS.

この変更が反映されるまでに時間がかかりますか?<AllowedMethod>HEAD</AllowedMethod>バケットのCORSポリシーに追加したばかりですが、まだ機能しません。
Salvatore Iovene 2017年

通常はありません。数分
OZER S.


12

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ヘッダーを使用して)異なる応答をキャッシュするはずです。


1
これは機能していないようです。詳細はありますか?これを有効にしましたが、まったく同じ問題が発生します。
Jaco Pretorius

7

私のために働いた唯一のこと(おそらく私が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


1
驚くばかり!どうもありがとう!
Rotimi、

1
あなたのコードは詳細だったので、それを実行するのに少し時間がかかりましたが、私はほとんど学びませんでした。その一部を適用して、ソリューションを微調整しました。出来た。
Mohammed Moinuddin Waseem

3

私はこれと同じ問題を抱えていて、このリンクが私に解決策を提供しました:

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

それの短いバージョンは:

  1. S3 CORS設定を編集します(私のコードサンプルが正しく表示されませんでした)
    注:これは元の質問ですでに行われています
    注:提供されたコードは非常に安全ではありません。リンク先のページで詳細をご覧ください。
  2. ディストリビューションの「動作」タブに移動し、クリックして編集します
  3. 「Forward Headers」を「None(Improves Caching)」から「Whitelist」に変更します。
  4. 「ホワイトリストヘッダー」リストに「オリジン」を追加します
  5. 変更を保存します

cloudfrontディストリビューションが更新されます。これには約10分かかります。その後、すべてが順調に進んでいるはずです。CORS関連のエラーメッセージがブラウザからなくなったことを確認することで確認できます。


2

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ユーザーを思い出すための投票に値します。
mohrtan

asp.netコアを使用していますが、これをappsettings.jsonファイルに追加するにはどうすればよいですか?
Yusuff Sodiq

1

ここに素敵な記事があります

nginx / apacheでこれを構成するのは誤りです。
ホスティング会社を使用している場合は、エッジを構成できません。
Dockerを使用している場合、アプリは自己完結型である必要があります。

一部の例を使用してconnectHandlersいますが、これはドキュメントのヘッダーのみを設定することに注意してください。使用rawConnectHandlersは、提供されるすべてのアセット(fonts / css / etc)に適用されます。

  // 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();
  });

これは、フレーミングなどのブラウザポリシーを確認する良い機会です。


0

node.jsをサーバーとして使用する場合は、オリジンの使用を追加するだけです...

このような

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

発生源への対応が必要


-5

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- *)をフォントアセットに追加する

  • font_assetsGemfile にgem を追加します。
  • bundle install
  • に追加config.font_assets.origin = '*'config/application.rbます。より詳細な制御が必要な場合は、異なるオリジン値を異なる環境に追加できます。たとえば、config/config/environments/production.rb
  • curl -I http://localhost:3000/assets/your-custom-font.ttf
  • Herokuにコードをプッシュします。

CORS HTTPヘッダーを転送するようにCloudfrontを構成する

Cloudfrontで、ディストリビューションを選択し、[動作]タブで、フォント配信を制御するエントリを選択して編集します(ほとんどの単純なRailsアプリの場合、ここには1つのエントリしかありません)。変更フォワードヘッダ「Whilelist」を「なし」から。次のヘッダーをホワイトリストに追加します。

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

それを保存すればそれだけです!

警告:CORSエラーがなくても、Firefoxがフォントを更新しないことがあります。この場合、ページを数回更新して、Firefoxが本当に決心していると確信させてください。


4
リンクのみの回答は避けてください。リンクされた記事から関連するスニペットを回答にコピーできると便利です。ありがとう。
bPratik 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.