2011-02-28 131 views
39

我有一个PHP脚本,只返回纯文本没有任何html。现在我想打一个卷曲的请求到该脚本,我得到如下回应:如何从CURL响应中删除HTTP标头?

HTTP/1.1 200 OK 
Date: Mon, 28 Feb 2011 14:21:51 GMT 
Server: Apache/2.2.14 (Ubuntu) 
X-Powered-By: PHP/5.2.12-nmm2 
Vary: Accept-Encoding 
Content-Length: 6 
Content-Type: text/html 

6.8320 

的实际工作中的反应仅仅是6.8320因为没有任何HTML文本。我想通过删除标题信息从上述响应中检索它。

我已经过压缩剧本了一下:

$url = $_GET['url']; 

if (!$url) { 

    // Passed url not specified. 
    $contents = 'ERROR: url not specified'; 
    $status = array('http_code' => 'ERROR'); 

} else if (!preg_match($valid_url_regex, $url)) { 

    // Passed url doesn't match $valid_url_regex. 
    $contents = 'ERROR: invalid url'; 
    $status = array('http_code' => 'ERROR'); 

} else { 
    $ch = curl_init($url); 

    if (strtolower($_SERVER['REQUEST_METHOD']) == 'post') { 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); 
    } 

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    curl_setopt($ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT']); 

    list($header, $contents) = preg_split('/([\r\n][\r\n])\\1/', curl_exec($ch), 2); 

    $status = curl_getinfo($ch); 

    curl_close($ch); 
} 

// Split header text into an array. 
$header_text = preg_split('/[\r\n]+/', $header); 

if (true) { 
    if (!$enable_native) { 
    $contents = 'ERROR: invalid mode'; 
    $status = array('http_code' => 'ERROR'); 
    } 

    // Propagate headers to response. 
    foreach ($header_text as $header) { 
    if (preg_match('/^(?:Content-Type|Content-Language|Set-Cookie):/i', $header)) { 
     header($header); 
    } 
    } 
    print $contents; 
} 

任何想法,我需要改变,以除去从响应的头信息?

+0

的'内容type'头是错误的! – reinierpost 2012-10-19 07:15:37

+1

可能重新标题提及它是PHP,我正在寻找命令行卷曲 – 2012-11-21 07:41:55

回答

60

只要将CURLOPT_HEADER设置为false即可。

+0

对不起,先生,如果你在ssh中使用CURL get命令,你如何做到这一点? – Luka 2017-01-18 14:55:12

-2

只是不要设置CURLOPT_HEADER

+0

这将删除整个响应 – 2011-02-28 14:07:59

+0

然后,其他事情正在进行。 CURLOPT_HEADER告诉CURL将头部包含在从curl_exec返回的内容中。将其设置为false(反正是默认值)不应删除整个响应。 – 2011-02-28 14:34:33

+0

我也很奇怪。设置为false或删除都会导致空白页面。 – 2011-02-28 14:37:06

1

如果您使用的是nuSoap,那么您可以访问数据而无需标题$nsoap->responseData$nsoap->response,如果您需要完整的标题。

以防万一有人需要。

-2

只是不设置curl_header在卷曲请求,或者将其设置为z or false
这样
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HEADER, false);

1

如果由于某种原因,你必须curl_setopt($ch, CURLOPT_HEADER, 1);获得例如饼干,下面的工作为了我。不知道它是否100%可靠,但值得一试

$foo = preg_replace('/HTTP(.*)html/s',"",$curlresult); 
4

只是为了以后使用,如果有人需要。我遇到了同样的情况,但只需要删除标题文本,而不是内容。我是在头得到的反应是(包括空格):

HTTP/1.1 200 OK 
Cache-Control: private, no-cache, no-store, must-revalidate 
Content-Language: en 
Content-Type: text/html 
Date: Tue, 25 Feb 2014 20:59:29 GMT 
Expires: Sat, 01 Jan 2000 00:00:00 GMT 
Pragma: no-cache 
Server: nginx 
Vary: Cookie, Accept-Language, Accept-Encoding 
transfer-encoding: chunked 
Connection: keep-alive 

我想删除HTTP开始,直到保持活动以空格:

$contents = preg_replace('/HTTP(.*)alive/s',"",$contents); 

为我做到了。

+0

快速修复。谢谢 – bkac 2016-12-11 19:13:03

32

做到这一点您的通话卷曲后:

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size); 
$body = substr($response, $header_size); 
+0

这节省了我的一天。谢谢。 – 2016-02-16 05:48:28

+0

这应该是选定的答案。你可以保留细节,但不会出现在结果中。如果你真的需要它们,比没有它们要好得多(在我的情况下,我需要它们)。 – moeiscool 2016-06-15 01:16:28

1

更新CURLOPT_HEADER的价值为0虚假

curl_setopt($ch, CURLOPT_HEADER, 0);