如何使用PHP / cURL代理请求并代理响应头?

时间:2013-05-16 20:04:35

标签: php curl proxy

我有一个浏览器客户端从我的网络服务中获取部分内容,例如使用Range: bytes=100000-200000。请求进入PHP页面fetch.php。在该PHP页面中,我使用$_SERVER['HTTP_RANGE']获取请求的范围,然后使用curl_setopt - CURLOPT_RANGE将其设置为curl请求。我遇到的问题是,远程服务器使用206 Partial Content状态和Content-Range标头进行响应,但我的PHP页面只响应200 OK而没有Content-Range,因此结果是客户认为完整的部分文件。问题是,如何在PHP中设置原始请求的结果Content-Range

如果我知道前面的范围,我不知道,我可以使用header命令并完成它,但在响应中返回Range。我可以在curl中设置接收包含内容的所有标头然后解析标头,使用header设置它并将响应设置为206然后回显所有数据...但数据是二进制的,而不是提到非常大,所以这似乎是次优的,充其量。

我想知道我是否能以某种方式在PHP中设置一个选项,以便不发送它自己的任何标头,并且基本上只是将整个响应回送给请求者。如果没有充分考虑这一点,可能会出现其他标题,缓存,连接,代理等问题。

也许有一种方法我只能收到curl的头文件(某种partial_execute?),得到我需要的东西,设置头文件和响应代码,然后基本上完成exec和实际响应get的输出?我无法从卷曲中看到如何实现这一目标。

设置实际的反向代理也不是一个选项,因为PHP脚本实际上确定了资源的目标服务器(它不是静态的)。

我想我可以跳过使用curl并直接进行TCP / TLS连接并管理HTTP请求/响应。

还有其他想法或可能吗?谢谢!

2 个答案:

答案 0 :(得分:1)

它可能是也可能不是最佳解决方案,但它适用于我需要的场景。基本上只需使用stream_socket_client进行自己的HTTP(S)获取,确保传递必要的响应代码和标题,例如:

while ( true ) {
    $h = stream_get_line( $fp, 2048, "\r\n");
    if ( !$h ) {
        break;
    }
    if ( 0==strncasecmp( $h, 'Content-', 8 ) ) {
        header( $h );
    }
    else if ( 0==strncasecmp( $h, 'HTTP/1.', 7 ) ) {
        header( $h );
    }
}

fpassthru( $fp );

答案 1 :(得分:0)

  

也许有一种方法我只能收到来自curl的标题

这是HTTP协议的一部分,请参阅:What is the easiest way to use the HEAD command of HTTP in PHP?

我不明白其他问题是什么。

如果您收到部分回复,可能是由于连接超时。这可以使用以下方式更改:

CURLOPT_CONNECTTIMEOUT