【问题标题】:PHP curl how to retrieve headers when using Proxy. CURLOPT_HEADERFUNCTION?PHP curl 如何在使用代理时检索标头。 CURLOPT_HEADERFUNCTION?
【发布时间】:2015-12-15 16:42:38
【问题描述】:

我正在使用这样的代理连接到一个站点:

$curl = curl_init();
curl_setopt($curl, CURLOPT_PROXY, $proxy);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl, CURLOPT_HEADER, TRUE);
$result = curl_exec ($curl);

问题是CURLOPT_HEADER 正在从代理连接返回标头,而我需要从实际请求到 URL 的标头。我相信解决方案涉及使用CURLOPT_HEADERFUNCTION,但我不明白如何使用它。

我试过这个(取自 SO 的其他地方):

curl_setopt($curl, CURLOPT_HEADERFUNCTION, "HandleHeaderLine");

使用功能:

function HandleHeaderLine($curl, $header_line ) {
    echo "<br>YEAH: ".$header_line; // or do whatever
    return strlen($header_line);
}

但似乎我只能返回字节数。我不确定如何获得实际价值。在我的情况下,我只想要 Location 标题。

谢谢。

【问题讨论】:

  • curl 是返回 only 代理标头还是 所有 标头?因为如果它是第一个,它可能与您的代理配置有关,可能会抑制此类信息(我不认为如何,因为浏览器需要它们),如果是第二个,您只需处理它返回的字符串标题(@ 987654321@).
  • Curl 肯定是在检索所有标题。当我启用verbose 时,我可以看到它。问题是 CURLOPT_HEADER 只返回代理头,所以我不能用它来检索 Location

标签: php curl proxy


【解决方案1】:

CURLOPT_HEADERFUNCTION 的匿名回调将需要访问您要在其中存储标头信息的变量。有几种不同的方法,但这里有一些示例:

使用use

$headers = [];
...
function HandleHeaderLine($curl, $header_line) use (&$headers)
{
    ...
    if ($isHeaderIWant) {
        $header[] = 'some info';
    }
    return strlen($header_line);
}

使用类属性:

private $headers = [];
...
function HandleHeaderLine($curl, $header_line)
{
    ...
    if ($isHeaderIWant) {
        $this->header[] = 'some info';
    }
    return strlen($header_line);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 2021-08-09
    • 1970-01-01
    • 2010-11-25
    • 2012-05-16
    • 2022-01-07
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多