PHP 使用 cURL 請求 HTTPS 介面時失敗,但命令列下直接執行 curl 指令卻正常。
伺服器所在機房網路環境無法驗證目標伺服器的 SSL 憑證(如缺少 CA 憑證束、自簽憑證等)。
在開發/測試環境中,可選擇跳過 SSL 憑證驗證(生產環境慎用):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
生產環境建議正確配置 CURLOPT_CAINFO 指向有效的 CA 憑證檔案(如 cacert.pem)。
curl_exec 回傳 bool(false),錯誤訊息為 "Empty reply from server"var_dump(curl_error($ch)) 獲取錯誤:「Empty reply from server」。curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
HTTP/1.1 100 Continue 後隨即斷開連線,未收到預期的 200 OK。cURL 預設發送 Expect: 100-continue 標頭,告知伺服器「我要傳送大量資料,請先確認」。Apache 收到後回應 100 Continue,但 PHP 的 cURL 處理邏輯在收到 100 狀態碼後誤判為流程結束,未繼續接收後續的 200 回應。
發送空的 Expect: 標頭覆蓋預設行為:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
此問題最早由開發者於 2006 年發現並記錄於部落格 PHP and cURL: Disabling 100-continue header,至今仍是 cURL 對接特定伺服器(如 Nginx、Apache 特定配置)時的經典坑點。