CORS対応のAPIをPHPで作ってみた

こんばんは。きわさです。

前回調べた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-MethodAccess-Control-Allow-HeadersはOPTIONSメソッドのリクエストに対するレスポンスにあれば良いですが、Access-Control-Allow-Originは、GETやPOSTのリクエストに対するレスポンスにも必要なようです。

勉強になりました。

スポンサーリンク