skillup

技術ブログ

JavaScript サーバー・ネットワーク

クロスドメインがらみのajax

投稿日:

ajaxで別ドメインに対して、プログラムを実行したい時に注意すべきことなどを。

ログ、レスポンスヘッダをとにかく追う

アクセス先のログやブラウザのレンポンスヘッダーを注意深くみてどういう結果が帰ってきているのかをしっかり追うようにしましょう。その上で下記のような対策が必要になってきます。

特定ドメインからの許可

ajaxから直で他サーバーにアクセスをする場合ですが、下記のようなエラーメッセージが出て弾かれる場合が多いかと思います。

通常ですとクロスドメインからのリクエストが許可されていないことが多いため、弾かれます。

この場合、APIを受けとる側での.htaccessなどに下記のような設定を書いておけば許可することができます。

アスタリスクは全許可ですが、POST,GETなどのメソッド単位でのコントールやHearderでのControlもできるでしょう。

*ただしmod_headerがインストールされていることが前提のようです。

フレームワーク側での認証ロジック(フレームワークによる)

上記のような対策をしてもエラーが返ってきてしまうということは多いかと思います。その場合、302エラーの場合、フレームワークの認証ロジックを疑ってみましょう。

私の場合、Laravelだったのですが、Routeでコントロールできる通常の認証以外にも、認証をコントールしている場合があるので、その部分を調べてみましょう。

CSRF対策(フレームワークによる)

Laravelの場合、上記の対策がディフォルトで組み込まれているので、通常認証をクリアできても500エラーが返ってきます。その場合、MiddleWare内でIP制限などをすると良いと思います。

一例として下記のような書き方ができます。

500エラー対策

実際のAPIまで処理が飛んでいればあと一歩かと思いますが、500エラーで返ってきてしまう場合はプログラムのどこかで落ちているため、とにかくこまめにログを追うしかないと思います。

API時の実装時に注意しておきましょう。

ajax側のHTTPヘッダ

ajax側のHTTPリクエストが適切でない場合、配列を送っているのに、内容がからということがあります。その場合、ajaxのheadをapplication/jsonにするかJSON.stringifyでPOST内容を文字列化しましょう。

ちなみにブラウザでajaxを飛ばして直接アクセスするより、ローカルのPHPにajaxにアクセスをして、PHP側からサーバーを通してAPIにアクセスした方がテストも簡単で実行しやすいです。(CurlよりはGuzzleなどのライブラリを使いましょう。)

参考リンク

サーバサイドのCORS対応

XHR2でサブドメインのワイルドカードOriginに対してCORSを許可する設定、他。

Laravel5.5 で Cross Domain する

今時のPHP HTTPクライアントのGuzzleを使ってみた

 

-JavaScript, サーバー・ネットワーク
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

gulpインストールとタスクの実行

今更ですが、gulpインストールと作業に関して。 less使ってたんですが、コンパイルをずっとatomのエディタで行っていたんですが、一般的にはgulpで実行する方のほうが多いでしょう。 別件でgul …

no image

ansible localでの使用,sudoに関して

最近継続的に調査しているansibleについて Contents1 local2 sudo local ansibleは通常別のホストに対して行うものですが、 hostsファイルのIPを変更し、以下の …

no image

zabbixについて 

現在、携わっているプロジェクトでサーバー監視をする必要性がでてきたので、監視ツールについていろいろ調べとります。 Contents1 サーバー監視とは2 サーバー監視ツールとは3 おおまかなイメージ4 …

no image

docker上でミニサービスを起動させるまで

dockerで何とかホストOS上でサービスを起動させるところまでは終了。 Contents1 やったこと2 苦戦したこと やったこと CentOSのイメージを取得 [crayon-5ce7bb78dd …

no image

dockerコンテナ間での連携(PHP+MySQL)

dockerでのコンテナ間の連携について 以前、dockerではCentOSのイメージからコンテナを作成し、その中にphp,apache,mysqlをインストールしてましたが、dockerの使い方とし …