當使用 cURL 發送 POST 數據超過 1024 字節時,libcurl 默認會啟用「Expect: 100-continue」機制:先發送帶有 Expect: 100-continue 請求頭的預請求,待服務器回應 100 Continue 後再發送實際 Body。但部分服務器(如 lighttpd)不支持此機制,直接返回 417 Expectation Failed,導致邏輯失敗。
依據 RFC 2616 Section 8.2.3,客戶端可在發送大體積數據前詢問服務器是否願意接收。libcurl 將 1024 字節作為啟用閾值,此行為屬客戶端默認策略,非服務器強制要求。
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Expect:"));
在 HTTP 頭中顯式發送空的 Expect:,即可阻止 libcurl 添加 Expect: 100-continue,請求將一次性發送完整 Body,兼容不支持 100-continue 的服務器。
CURLOPT_HTTPHEADER => ['Expect:'] 設置,陣列值為 "Expect:"(冒號結尾)。Content-Type、Authorization 等共存。一行代碼即可解決由客戶端預請求機制引發的 417 錯誤,建議在封裝通用 cURL 請求函數時默認加入此頭部。