🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

3376閲覧

access-control-allow-origin で許可されているが、実際の POST リクエストが発生しない

eRaNTeRS

総合スコア5

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

3クリップ

投稿2019/12/13 05:27

前提・実現したいこと

API Gateway で CORS を実現したいです。
ローカル環境の Vue で作成したページから、API Gateway でファイルを POST したいです。

発生している問題・エラーメッセージ

API Gateway で CORS は有効化しています。

Preflight リクエストが送信されて、そのレスポンスで access-control-allow-origin としてローカルのアドレスが許可されているのは確認しました。
しかし、実際の POST リクエストが発生しないです。
この原因がわかりません。

以下、Chrome(Version 79.0.3945.79) のコンソールに表示されていたエラーメッセージです

Error: Request has been terminated Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.

ネットワークタブを見ると、OPTIONS メソッドで Preflight リクエストが送信され、レスポンスを200で受け取っていることは確認できました。
また、レスポンスで Origin として許可されていることも確認しました。

ヘッダ

  • リクエストヘッダ
:authority: xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com :method: OPTIONS :path: /dev/upload :scheme: https accept: */* accept-encoding: gzip, deflate, br accept-language: en-US,en;q=0.9,ja;q=0.8 access-control-request-headers: access-control-allow-origin,content-type access-control-request-method: POST origin: http://192.168.0.20:8080 referer: http://192.168.0.20:8080/ sec-fetch-mode: cors sec-fetch-site: cross-site user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36
  • レスポンスヘッダ
access-control-allow-headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token access-control-allow-methods: DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT access-control-allow-origin: * content-length: 0 content-type: application/json date: Fri, 13 Dec 2019 04:02:02 GMT status: 200 via: 1.1 7408587aefcdfb48b378f51605d1bdd3.cloudfront.net (CloudFront) x-amz-apigw-id: En8BNGXcNjMFtWg= x-amz-cf-id: VOC8WZn8sPnsN5H1FJCyI4gqpFRgwgbr9QGQkny9KZtV0Xxujyjdxg== x-amz-cf-pop: NRT51 x-amzn-requestid: 3a1a7d61-6d46-4011-8b73-42bed4eb6ebf x-cache: Miss from cloudfront

試したこと

CURL コマンドで OPTIONS を叩くと、以下が返ってきます。
ちゃんと設定できているように思います。

curl -i -X OPTIONS https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/dev/upload HTTP/2 200 content-type: application/json content-length: 0 date: Fri, 13 Dec 2019 03:59:36 GMT x-amzn-requestid: eeaa4573-ab92-4c03-aef4-dd3252233c75 access-control-allow-origin: * access-control-allow-headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token x-amz-apigw-id: XXXXXXXXXXX access-control-allow-methods: DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT x-cache: Miss from cloudfront via: 1.1 xxxxxxxxxxxxxxxxxxxxxxxxxx.cloudfront.net (CloudFront) x-amz-cf-pop: NRT51-C2 x-amz-cf-id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/12/13 05:44

GETなら到達するのでしょうか?
eRaNTeRS

2019/12/13 06:12

GET でも同様でした。 ockeghem さんの指摘にもあるように、 リクエストヘッダが不適切なので、整理してみます。
yambejp

2019/12/13 06:18

パラメータなしなら戻ってくるのですかね? 単にそのマシンが直接httpsベースの外部サイトにつながらない可能性も あります。(たとえばproxy経由が必須だったり)
guest

回答1

0

ベストアンサー

リクエストヘッダの以下の行ですが…

HTTP

1access-control-request-headers: access-control-allow-origin,content-type

access-control-allow-originがついているのが解せないところです。ひょっとして、リクエストヘッダとしてaccess-control-allow-originを設定していませんか?
これはブラウザが自動的に設定するものなので、開発者が指定するものではありません。

投稿2019/12/13 05:56

ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eRaNTeRS

2019/12/13 06:03 編集

あ、そうですね。これは実際のリクエストでは不要ですね。 Preflight を発生させるため、単純リクエストにならないように、ダミーとしてこのヘッダをつけていました。
eRaNTeRS

2019/12/13 06:11

リクエストヘッダが不適切なので、整理してみます。
ockeghem

2019/12/13 06:36

手元で実験したところでは、access-control-allow-originを設定するとプリフライトリクエストに対する応答がエラーになるようです。Content-Typeをapplication/jsonにするくらいでシンプルなリクエストにならないので、ややこしいものはつけないことをお勧めします。
eRaNTeRS

2019/12/13 06:55

`access-control-allow-origin` をヘッダから外すと、実際のリクエストも発生させることができました。 POST でファイルがアップロードされていることが確認できました。 ありがとうございました! ブラウザ上、このヘッダに関するエラーメッセージが出ていなかったですが、これが原因だったようです。
eRaNTeRS

2019/12/13 06:56

回答が前後してしまいましたが、おっしゃるとおり、access-control-allow-origin をつけたことが原因でした。 大変助かりました。ありがとうございます。
ockeghem

2019/12/13 08:04

うまくいったようで良かったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問