[解決済み] OPTIONSルートにCORSヘッダを追加しても、ブラウザが私のAPIにアクセスできないのはなぜですか?
質問
Web フレームワーク Express.js を使用する Node.js アプリケーションで CORS をサポートしようとしています。私は、以下を読みました。 Googleグループでのディスカッション を処理する方法について、また、CORS がどのように機能するかについて、いくつかの記事を読みました。まず、こんなことをやってみました(コードはCoffeeScriptの構文で書かれています)。
app.options "*", (req, res) ->
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
# try: 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
# try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
うまくいかないようです。私のブラウザ(Chrome)は、最初のOPTIONSリクエストを送信していないようです。クロスオリジンのGETリクエストを送信する必要があるリソースのブロックを更新したところ。
app.get "/somethingelse", (req, res) ->
# ...
res.header 'Access-Control-Allow-Origin', '*'
res.header 'Access-Control-Allow-Credentials', true
res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
res.header 'Access-Control-Allow-Headers', 'Content-Type'
# ...
動作します(Chromeの場合)。Safariでも動作します。
と読んだことがあるのですが・・・。
CORSを実装しているブラウザでは、クロスオリジンの各GETまたはPOSTリクエストの前に、GETまたはPOSTがOKであるかどうかをチェックするOPTIONSリクエストがあります。
そこで一番の疑問は、なぜ私のケースではこれが起きないように見えるのか、ということです。なぜ私のapp.optionsブロックは呼び出されないのでしょうか?なぜメインのapp.getブロックでヘッダーを設定する必要があるのでしょうか?
どうすればいいですか?
主な質問に答えると、CORS 仕様では、POST または GET に単純でないコンテンツまたはヘッダーがある場合にのみ、OPTIONS 呼び出しが POST または GET の前に来るよう要求しています。
CORS のプリフライトリクエスト(OPTIONS コール)を必要とする Content-Type は、すべての Content-Type ただし、以下を除く :
-
application/x-www-form-urlencoded
-
multipart/form-data
-
text/plain
上記以外のContent-Typeを指定した場合、プリフライトのリクエストが発生します。
ヘッダーについては、すべてのリクエストヘッダー 下記以外の がプリフライトリクエストのトリガーとなります。
-
Accept
-
Accept-Language
-
Content-Language
-
Content-Type
-
DPR
-
Save-Data
-
Viewport-Width
-
Width
その他のリクエストヘッダはプリフライトリクエストのトリガーとなります。
そこで、次のようなカスタムヘッダを追加することができます。
x-Trigger: CORS
そして、それがプリフライトリクエストのトリガーとなり、OPTIONSブロックをヒットさせるはずです。
関連
-
[解決済み】AWS STS AssumeRoleへのアクセスを可能にする方法
-
[解決済み] E: npm パッケージを見つけることができません。
-
[解決済み] MongoNetworkError: 最初の接続でサーバー [localhost:27017] への接続に失敗 [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017] 。
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] REST APIからデータを取得しようとしたときに、要求されたリソースに'Access-Control-Allow-Origin'ヘッダーが存在しない。
-
[解決済み] プリフライト要求に対する応答がアクセス制御チェックを通過しない
-
[解決済み] CORSです。資格情報フラグが true の場合、Access-Control-Allow-Origin でワイルドカードを使用できない。
-
[解決済み】AngularJS がクロスオリジンリソースに対して OPTIONS HTTP リクエストを実行する場合
-
[解決済み】http://localhost CORS originが機能しないのはなぜですか?
-
[解決済み】リクエストヘッダーフィールドのAccess-Control-Allow-Headersが許可されない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リソースの読み込みに失敗しました: net::ERR_CONNECTION_REFUSED : Nodejs
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】ExpressJSとMeteorJSの比較【終了しました
-
[解決済み】MongoDBでコレクションを日付で並べ替えるには?
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] nodejs - http.requestでresponse.writeを使用する場合、第一引数は文字列またはBufferでなければなりません。
-
[解決済み] ReferenceError: describe は定義されていません NodeJs
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。