ネタ元
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);