Blocked by CORS Policyで読み込めないときの対策

AWS EC2 インスタンス上に Web サーバを立てて独自ドメインからその Web サイトに接続できるように設定したら,よくわからないエラーで一部リソースが読み込めなくなっていたので,とりあえずの対策を施しました.

エラー内容

Access to Font at 'http://www.example.com/fontawesome-webfont.woff?v=4.7.0' from origin 'http://example.mktia.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.mktia.com' is therefore not allowed access.

一部書き換えていますが,こんな感じです.

CORS とは

Cross-Origin Resource Sharing の略称で,異なるオリジン (スキーム,ホスト,ポート) 間の通信でデータをやり取りするための決まり,らしい.

参考:HTML5 における CORS について | Qiita

通常,ブラウザは攻撃者に対して情報漏洩しないよう,異なるオリジンからのリクエストに対してリソースを公開しないよう設定されているっぽいです.

そのため,上の例ではホストが www.example.com であるサーバの下のフォントファイルに example.mktia.com からのアクセスがあったため,エラーを返したと考えられます.

対策

Apache サーバで運用しているサイトでは,.htaccess ファイルを編集することで解決できるようです.

部外者のアクセスはブロックできるように,正規表現を用いて一部アクセスだけを許可するように設定します.

.htaccess

SetEnvIf Origin "^http://(.*)\.mktia\.com$" ACAO=$0
Header set Access-Control-Allow-Origin %{ACAO}e env=ACAO

この場合,ホストが xxxx.mktia.com のときはアクセスが認められるはずです.

参考:Access-Control-Allow-Origin ヘッダ関連のエラーが CORS なリクエスト時に出る場合の対処【Apache】| TeraDas

最後に

これまで CNAME を設定したときなどにも出ていたのかもしれませんが,初めて気づきました.そんな落とし穴があるとは,この世界は相変わらず知らないことだらけです.