質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

CORS

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

7439閲覧

CORSでpostとpatchでエラー

twin_bird

総合スコア230

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

CORS

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2017/04/25 09:45

サーバー側をLaravel、クライアント側をReactで構築しています。
サーバー側では、api.hogeというドメインでをAPI用に割当て、クライアント側は、admin.hogeドメインを割り当ててAPIとは別ドメインで運用しています。

サーバー側レスポンスヘッダの設定は、LaravelでCorsというミドルウェアを定義し、apiのルーティングにcorsミドルウェアを通すように設定しています。

<?php namespace App\Http\Middleware; use Closure; class Cors { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { return $next($request) ->header('Access-Control-Allow-Origin', 'http://admin.hoge') ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD') ->header('Access-Control-Allow-Credentials', 'true') ->header('Access-Control-Max-Age', '1000') ->header('Origin', 'Access-Control-Allow-Headers', 'Accept', 'Content-Type, X-Requested-With'); } }

クライアント側では、axiosで以下のようにリクエストしています。

リクエストヘッダのデフォルト設定を定義 // const api = axios.create({ baseURL: 'http://api.hoge/v1', timeout: 10000, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' } }); export function createCategory(props) { const request = api.post(`/categories`, props); return {type: CREATE_CATEGORY, payload: request}; }

postのapiをコールした時に以下のようなエラーがでます。
XMLHttpRequest cannot load http://api.hoge/v1/categories. Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

エラーが出た時のヘッダー情報は以下の通りです。
preflightのoptionメソッドのリクエストで止まるため、postが動作していない状態です。

Request URL:http://api.hoge/v1/categories Request Method:OPTIONS Status Code:200 OK Remote Address:192.168.33.111:80 Referrer Policy:no-referrer-when-downgrade Response Headers view source Access-Control-Allow-Credentials:true Access-Control-Allow-Methods:GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD Access-Control-Allow-Origin:http://admin.hoge Access-Control-Max-Age:1000 Allow:GET,HEAD,POST Cache-Control:no-cache Connection:keep-alive Content-Type:text/html; charset=UTF-8 Date:Tue, 25 Apr 2017 09:39:07 GMT Origin:Access-Control-Allow-Headers Server:nginx/1.10.2 Transfer-Encoding:chunked X-Powered-By:PHP/7.0.17 Request Headers view source Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:ja,en-US;q=0.8,en;q=0.6 Access-Control-Request-Headers:content-type Access-Control-Request-Method:POST Connection:keep-alive Host:api.hoge Origin:http://admin.hoge Referer:http://admin.hoge/dashboard/categories User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 Name categories api.hoge/v1

※ブラウザはchromeを使っています。

getdeleteのメソッドの場合は問題ないのですが、postpatchの時だけエラーがでます。

どこに問題があるのでしょうか??
調査方法や解決策を教えて頂けますと幸いです。

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

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

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

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

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

guest

回答1

0

調べ方はまずエラーメッセージをちゃんと読むことだと思います。

XMLHttpRequest cannot load http://api.hoge/v1/categories. Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

Content-TypeがAccess-Control-Allow-Headersで許されていないと言っていて、確かにresponseのヘッダにそもそもAccess-Control-Allow-Headersがありません。

getやdeleteでこのエラーにならないのはリクエストにcontent-typeヘッダがを含める必要が無いからでしょう。

そう思ってプログラムを見ると

PHP

1 ->header('Origin', 'Access-Control-Allow-Headers', 'Accept', 'Content-Type, X-Requested-With'); 2

となっていてなんか変ですね。

投稿2017/05/11 04:23

crhg

総合スコア1175

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問