PHPバックエンドを介してMySQLデータベースのデータを更新/挿入しようとしています。 AngularJSを使用してフロントエンドを構築し、REST APIとの通信に$http
サービスを使用しています。
私のセットアップは次のようになります。
$ httpProvider:経由でヘッダーを設定しています
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'};
そしてPOST-Callは次のようになります:
return $http({
url: url,
method: "POST",
data: campaign
});
ChromeのDev Consoleにこれが表示されます:
POSTからPUTに変更すると、PUTではなくOPTIONS呼び出しを送信します。そして、content-typeはcontent-type
のみに切り替わります。
私の要求ペイロードはオブジェクトとして送信されます:
ヘッダーを適切に設定するにはどうすればよいですか?
編集:
PHPバックエンドはいくつかのヘッダーを設定します:
$e->getResponse()
->getHeaders()
->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
$e->getResponse()
->getHeaders()
->addHeaderLine('Access-Control-Allow-Origin', '*');
何か足りないものはありますか?
はい、解決しました。
問題は何でしたか?
DELETE、PUT、およびPOSTのCORSワークフローは次のとおりです。
それは何ですか:
ここで重要:OPTIONSリクエストは資格情報を送信しません。
そのため、バックエンドサーバーはPUT要求を許可しませんでした。
解決策:
これを.htaccess
ファイル内に配置します
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ blank.php [QSA,L]
Header set Access-Control-Allow-Origin "http://sub.domain:3000"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
この後、blank.phpという空の.phpファイルをパブリックフォルダー内に作成します。
編集:1人のコメンターが指摘したように、空のPHPファイルを作成する代わりに、この書き換えルールを.htaccessファイルに追加できます。
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_Origin:%{HTTP:Origin}]]
明確にするために:
私が見つけることができる最高のウェブサイト CORSの詳細 。
$http
ヘッダーを手動で指定する必要はありません。すべてが舞台裏で行われ、POST
およびPUT
タイプのリクエストに対して自動的にapplication/json
に設定されます。だからあなたがすべきことはすべて
$http.post(url, data);
$http.put(url, data);