こんばんは。きわさです。
前回調べたCORS、今回はそれに対応するレスポンスを返すものを作ってみました。
サーバー側処理
XMLHttpRequestを使っていたらCORSエラー?がでた でも書いた通り、サーバー側ではOPTIONSメソッドと以下のリクエストヘッダに対応する必要があります。
Origin:
Access-Control-Request-Method:
Access-Control-Request-Headers:
今回はPHPで作っていきます。
まずはOPTIONSメソッドの確認です。
PHPでは$_SERVER変数から取得できます。リクエストメソッドのキーはREQUEST_METHODです。
if(isset($_SERVER['REQUEST_METHOD'])) { $method = $_SERVER['REQUEST_METHOD']; }
これでリクエストメソッドが取得できます。
$methodの値がOPTIONSであればPreflightと判断できます。
次にリクエストヘッダです。
リクエストヘッダも同様に$_SERVER変数から取得できます。
キーはHTTP_にヘッダのフィールド名にをつけたものです。
例えば、OriginであればHTTP_ORIGINです。
function preflight() { $origin = ""; $method = ""; $headers = ""; if(isset($_SERVER['HTTP_ORIGIN'])) { $origin = $_SERVER['HTTP_ORIGIN']; } if(isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) { $method = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']; } if(isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) { $headers = $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']; } /* ここに$origin、$method、$headersをチェックする処理を入れる */ header('Access-Control-Allow-Origin: ' . $origin); header('Access-Control-Allow-Method: ' . $method); header('Access-Control-Allow-Headers: ' . $headers); return; }
リクエストヘッダを取得しチェックした後、header()でレスポンスヘッダを追加します。
これでPreflightの対応はできました。
あとはOPTIONSではない場合に通常の処理を行うようにするだけです。
Access-Control-Allow-MethodやAccess-Control-Allow-HeadersはOPTIONSメソッドのリクエストに対するレスポンスにあれば良いですが、Access-Control-Allow-Originは、GETやPOSTのリクエストに対するレスポンスにも必要なようです。
勉強になりました。