2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

某 f 社のアドベントカレンダーAdvent Calendar 2021

Day 7

CORS エラーにハマったら MDN を見ると良いよ

Last updated at Posted at 2021-12-06

はじめに

フロントエンド開発で、別リソースの情報を表示したいけどうまく表示されないことがよくあると思います。
そのときにブラウザコンソールに赤い文字で Access to fetched to fetched has been blocked by CORS policy error と出て「またか...」となったことは一度や二度ではないでしょう。

CORS についてよく分からなくても、使っているフレームワークとエラーメッセージの reason を組み合わせて検索すると解決策が見つかるため、よく分からないままで放置していませんか?
この記事では CORS エラーについてその原因と解消するための説明。が MDN にまとまっているのでそれを紹介します。

小噺

当初は、そもそも CORS とはなんぞやと言う解説も載せようと思いましたが、先週別のカレンダーでもっと分かりやすい記事が掲載されていましたので、エラー周りのみを取り上げています。
(アドベントカレンダーってこういうことがあるから怖いよね)

CORS とは

以下の記事がとても分かりやすかったので、参考として貼らせていただきます :pray:

本題

CORS エラー時には以下のページの CORS のエラーメッセージの章から、該当するエラーのページが確認できます。

(:point_up: の記事へ直接飛ばなくても HTTP カテゴリーのページならどこでも、左の Table of contentsCORS エラー グループから探すことができます。

このページの利点は、

  • ブラウザコンソールに出てくるエラーメッセージがそのまま書いてあるので探しやすい。
  • CORS エラーについて網羅的 (なのかな?) に書かれている。
  • 各ページには「何が悪いのか」「どうすれば解消するか」についてまとまっているので、何となくの理解で終わらない。

ので、エラーが出たときに google 先生に聞いて解消する前に、これらのページからより深い理解に繋げてみてはいかがでしょうか。

[補足] エラーにならないケース

この記事では CORS エラーを起点に解消するサイトを紹介しましたが、エラーにならないがクライアントで扱うためにサーバからの許可が必要なケースがあります。
それは JavaScript からのレスポンスヘッダーへのアクセスです。

通常、クロスオリジンからのレスポンスヘッダーは一部を除いて JavaScript から読み取ることができません。
そのまま取得しようとしても undefined 扱いになります。
これを JavaScript でも扱うためには、レスポンスヘッダーに Access-Control-Expose-Headers を加える必要があります。

例えば Content-Disposition ヘッダーからファイル名を取得したい場合は、以下のようなヘッダーをレスポンスに加える必要があります。
(複数ある場合は , で区切って指定可能です)

Access-Control-Expose-Headers: Content-Disposition

まとめ

MDN って良いよね :relaxed:

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?