所以,长话短说,我有一个使用 MVC Web API 作为后端的 AJAX 应用程序。然而,客户端从不同的域调用并使用 PHP 代理文件来解决跨域请求问题。
但是,使用 PHP 代理时,Web API 会使用 100 Continue
HTTP header 来响应某些请求,并且任何返回此 header 的请求都需要花费过多的时间才能完成(我们说的是最多 2分钟左右),也可能返回无效响应。
这appears to be a known issue with cURL解决方法通常被引用为插入以下行以删除 cURL 请求中的 expect: 100 header
不幸的是,解决方案对我来说似乎难以捉摸:
$headers = getallheaders();
$headers_new = "";
foreach($headers as $title => $body) {
$headers_new[] = $title.": ".$body;
}
//$headers_new[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_new);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:') );
此代码有效但删除了所有其他 header (这对我来说不可行,因为我正在使用 HTTP 基本身份验证 header 通过 API 进行身份验证)。
您可能还注意到我尝试将 Expect:
添加到现有 header 中,但这对我也没有帮助。
如何维护现有 header ,同时防止 cURL 期望 100 继续?
最佳答案
使用$headers_new[] = 'Expect:';
确实有效除非$headers_new
数组包含一个字符串 '期望:100-继续'
。在这种情况下,您需要将其从数组中删除,否则它将期望 100 继续(逻辑上)。
因为在您的代码中您使用了 getallheaders()
并且您没有检查它是否已经包含 Expect: 100-continue
header ,所以您的情况可能就是这种情况。
这里是一般情况的总结(以及创建它的脚本):
PHP Curl HTTP/1.1 100 Continue and CURLOPT_HTTPHEADER
GET request ..........................................: Continue: No
GET request with empty header ........................: Continue: No
POST request with empty header .......................: Continue: Yes
POST request with expect continue explicitly set .....: Continue: Yes
POST request with expect (set to nothing) as well ....: Continue: Yes
POST request with expect continue from earlier removed: Continue: No
代码:
<?php
$ch = curl_init('http://www.iana.org/domains/example/');
function curl_exec_continue($ch) {
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$continue = 0 === strpos($result, "HTTP/1.1 100 Continue\x0d\x0a\x0d\x0a");
echo "Continue: ", $continue ? 'Yes' : 'No', "\n";
return $result;
}
echo "GET request ..........................................: ", !curl_exec_continue($ch);
$header = array();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "GET request with empty header ........................: ", !curl_exec_continue($ch);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('hello'));
echo "POST request with empty header .......................: ", !curl_exec_continue($ch);
$header[] = 'Expect: 100-continue';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect continue explicitly set .....: ", !curl_exec_continue($ch);
$header[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect (set to nothing) as well ....: ", !curl_exec_continue($ch);
unset($header[0]);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
echo "POST request with expect continue from earlier removed: ", !curl_exec_continue($ch);
关于php - 如何阻止 cURL 使用 100 Continue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158675/