PHPのfile_get_contents関数はデフォルトではHTTP/1.0で通信をするようです。実は、Azure FunctionsにてcURL関数が使えなかったのでfile_get_contents関数を使うようにプログラムを修正したのですが、ローカルで検証したところ「failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request」が出て通信できなくなってしまったのです。いろいろ調べた結果、どうやら「HTTP/1.0」というメッセージがキモのようでしたので、HTTP/1.1で通信するように修正しました。
$header = array( "Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req), "Connection: Close" ); $context = array( "http" => array( "protocol_version" => "1.1", "method" => "POST", "header" => implode("\r\n", $header), "content" => $req, "ignore_errors" => true ) ); $res = file_get_contents($redirecturl, false, stream_context_create($context));
ちなみに、ignore_errorsはtrueにするとfile_get_contents関数でエラーになった時に詳しい状況を取得することが可能になります。デフォルトではfalseらしく、通信エラーの時には返り値がfalseにしかなりません。ここをtrueにすると、返り値自体はfalseなのですが、$http_response_header[0]を参照することでエラーコードを取得することができるようになります。
話は戻って、HTTP/1.1で通信するにはprotocol_versionに1.1を指定すればOKです。本来、cURL関数が使えればいいだけの話なので、ほとんどの情報が「cURL関数を使え」って書いてあるんですよねぇ。でも、cURL関数が使えない環境もあり得ますので、ここに情報として記しておきます。
コメント