" 不正なURIまたはクロスサイトアクセスは許可されていません "の問題が原因で、Cloudfrontを介して提供されるフォントがFirefoxで壊れています。これを修正するには、「Access-Control-Allow-Origin」ヘッダーをワイルドカードまたはソースドメインに設定する必要があることを理解しています。
私が抱えている問題は、CloudfrontがOriginからのヘッダーを受け入れていないようです。
たとえば、サーバーにpingを実行してフォントを取得すると、次のようなヘッダーが表示されます。
curl -I -s "https://mysite.com/wp-content/themes/my-theme/includes/fonts/ProximaNova-Reg-webfont.ttf"
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 29 Jan 2014 16:03:03 GMT
Content-Type: application/x-font-ttf
Content-Length: 44992
Last-Modified: Tue, 28 Jan 2014 22:21:41 GMT
Connection: keep-alive
ETag: "52e82d75-afc0"
Expires: Thu, 29 Jan 2015 16:03:03 GMT
Cache-Control: max-age=31536000
Access-Control-Allow-Origin: https://mysite.com
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3600
Accept-Ranges: bytes
この応答はすべて問題ありません。ただし、同じリソースのCloudfrontにpingすると、次のようになります。
curl -I -s "https://ds6dj5kp03o39.cloudfront.net/wp-content/themes/my-theme/includes/fonts/ProximaNova-Reg-webfont.ttf"
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 44992
Connection: keep-alive
Date: Wed, 29 Jan 2014 16:22:30 GMT
Server: Apache/2.2.16 (Debian) mod_ssl/2.2.16 OpenSSL/0.9.8o
Last-Modified: Wed, 22 Jan 2014 02:44:45 GMT
ETag: "5d633-afc0-4f0861b87a140"
Accept-Ranges: bytes
Cache-Control: max-age=3600
Expires: Wed, 29 Jan 2014 17:22:30 GMT
X-Cache: Miss from cloudfront
Via: 1.1 850e11212c3f83bfb138469e9b3b7718.cloudfront.net (CloudFront)
X-Amz-Cf-Id: M4qkj9FwjdAUW91U4WeZzxEI0m7vOmiQvryS55WwoeU5Ks11IC71ig==
Originヘッダーはすべて完全に無視されているようです。私の質問は、どのようにしてCloudfrontがアセットヘッダー、特に重要な「Access-Control-Allow-Origin」ヘッダーを受け入れるようにするのですか?
助けてくれてありがとう!
これに後日アクセスする場合、カスタムOriginでこの問題が発生し、IS Access-Control-Allow-Originヘッダーが既に正しく提供されている場合は、次の2つを確認または試しました。 :
Apache
フォントファイルに正しいMIMEタイプを設定するには、次の行をconfigに追加します。
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/font-woff .woff
設定を編集できない場合は、プロジェクトを含むフォルダーに.htaccess
ファイルを作成し、そこに行を追加します。
CORSヘッダーの場合、以下のコードを追加します。
<FilesMatch ".(eot|ttf|otf|woff)">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
これらの変更を行ったらservice Apache2 restart
を実行する必要があります。エラーInvalid command 'Header'
を受け取った場合は、a2enmod headers
で実行できるApacheでmod_headerモジュールを有効にしていないことを意味します
nginx
デフォルトでは、nginxにはフォントのデフォルトのMIMEタイプがなく、.eot
ファイルのMIMIタイプが間違っています。 configsのあるフォルダーに移動し、mimeタイプが汚染されている場所を見つけます。通常、それはmimes.confファイルにあります。
.eot
を検索し、それを文字列化します。以下に文字列を追加します。
application/vnd.ms-fontobject eot;
application/x-font-ttf ttf;
application/font-woff woff;
CORSヘッダーの場合、vhost設定に次のようなものを追加します
location ~* \.(eot|ttf|woff)$ {
add_header Access-Control-Allow-Origin *;
}
デフォルト設定では、CloudFrontはヘッダーを検査したり、それらの値をキャッシュしたりしません。考えられる原因は、リソースが「Origin」ヘッダーなしで最初に要求されているため、S3が応答としてCORSヘッダーを提供していないことです。応答はキャッシュされ、後でクロスオリジンリクエストを行うと、キャッシュされた応答は応答なしで提供されます。
OriginヘッダーをS3に転送し、さまざまなヘッダー値に対するさまざまな応答をキャッシュするようにCloudFrontを構成できます。これにより、CloudFrontは必要に応じてCORSヘッダーをキャッシュします。 http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-cors を参照してください。
あなたがしたことは正しいですが、CloudFrontは結果をキャッシュするので、古いバージョンのキャッシュを取得しています。あなたはこれをヘッダーで見ることができます:あなたのサイトから:
最終変更日:2014年1月28日火曜日22:21:41 GMT
クラウドフロントから:
最終変更日:2014年1月22日水曜日02:44:45 GMT
今、それを再び機能させる方法:
a)オブジェクトが期限切れになるのを待ってから、再度リクエストします。 CloudFrontはそれを更新します。
b)Amazon aws console> cloudfront> distribution> Invalidationsを使用してオブジェクトを無効化します。これの使用方法の詳細については、 http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html を参照してください
c)名前を変更するか、ファイルのバージョン管理された名前の使用を開始します。 ProximaNova-Reg-webfont_2.ttf
CoRSヘッダーを動的に評価するためのバケットの明示的な構成があります。
CORSヘッダーを設定しようとしたり、CFやS3に設定したりすると、キャッシュモデルが壊れるため、破棄されます。