首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP cURL 發送 POST 請求遇到 "Expect: 100-continue" 導致 417 錯誤的解決方案

     編輯:PHP 相關知識

當使用 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 字節作為啟用閾值,此行為屬客戶端默認策略,非服務器強制要求。

解決方法:發送空 Expect 頭禁用機制

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Expect:"));

在 HTTP 頭中顯式發送空的 Expect:,即可阻止 libcurl 添加 Expect: 100-continue,請求將一次性發送完整 Body,兼容不支持 100-continue 的服務器。

補充說明

  • 若需保留 100-continue 機制(大文件上傳可節省帶寬),請確保服務器正確實現 RFC 2616 規範。
  • 同樣可通過 CURLOPT_HTTPHEADER => ['Expect:'] 設置,陣列值為 "Expect:"(冒號結尾)。
  • 此設置不影響其他自定義頭部,可與 Content-Type、Authorization 等共存。

一行代碼即可解決由客戶端預請求機制引發的 417 錯誤,建議在封裝通用 cURL 請求函數時默認加入此頭部。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved