ネタ元
file_get_contents()でURLから取得できないサーバーがあるんですよー
function curl_get_contents($url){
// 「scheme://」の形式でないならローカルファイルとみなす
if (!preg_match('/^[a-z][a-z0-9+\-.]+:\/\//i', $url)) {
return file_get_contents($url);
}
// それ以外は従来通り cURL で取得
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] ?? 'Mozilla/5.0');
// テスト環境用:SSL証明書の検証をスキップ
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // ←★これが重要
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // ←★これも重要
$response = curl_exec($ch);
if ($response === false) {
error_log("[ERROR] curl_exec failed: " . curl_error($ch));
} else {
error_log("[LOG] curl_exec succeeded: $url");
}
curl_close($ch);
return $response;
}
サーバー切り替え中テストでhostsでIPを切り替えてると
SSL証明書と実IPが一致しておらず、ブラウザでは「保護されていない接続」扱いになります。
PHP の cURL は デフォルトでSSL証明書の検証を強制するため、接続に失敗します(= curl_exec() が false を返す)
なので切り替えテストのときだけは SSL証明書の検証をスキップ する処理をいれておくこと。
POST送る場合はこちらを参考に。
$POST_DATA = array(
'foo' => 'bar'
);
$curl=curl_init("URL");
curl_setopt($curl,CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA));
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, FALSE); // オレオレ証明書対策
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, FALSE); //
curl_setopt($curl,CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl,CURLOPT_COOKIEJAR, 'cookie');
curl_setopt($curl,CURLOPT_COOKIEFILE, 'tmp');
curl_setopt($curl,CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
$output= curl_exec($curl);