jmi*_*lar 21 php proxy jquery curl
所以,长话短说,我有一个使用MVC Web API作为后端的AJAX应用程序.然而,客户端从不同的域调用并使用PHP代理文件来解决跨域请求问题.
但是,使用PHP代理,Web API会使用100 ContinueHTTP标头响应某些请求,并且任何获取此请求的请求都需要花费过多的时间才能完成(我们说的最多2分钟左右)并且还可以返回无效的响应.
这似乎是cURL的一个已知问题,解决方法通常被引用为插入以下行以删除cURL请求中的expect:100标头
不幸的是,解决方案对我来说似乎难以捉摸:
$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:') );
Run Code Online (Sandbox Code Playgroud)
此代码有效,但删除了所有其他标头(这对我来说是不可行的,因为我使用HTTP基本身份验证头来通过API进行身份验证).您可能还会注意到我尝试将其添加Expect:到现有标头中,但这对我也没有帮助.
如何维护现有标头,还可以防止cURL期望100继续?
hak*_*kre 21
使用$headers_new[] = 'Expect:';不工作,除非该$headers_new数组包含字符串是'Expect: 100-continue'.在这种情况下,您需要将其从数组中删除,否则它将期望100继续(逻辑上).
因为在您使用的代码中getallheaders(),您并未检查它是否已包含Expect: 100-continue标题,因此在您的情况下可能就是这种情况.
以下是一般情况(以及创建它的脚本)的摘要:
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
Run Code Online (Sandbox Code Playgroud)
码:
<?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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27982 次 |
| 最近记录: |