我有一个浏览器客户端从我的Web服务中获取部分内容,例如使用Range: bytes=100000-200000
。请求进入PHP页面fetch.php。在该PHP页面中,我使用$_SERVER['HTTP_RANGE']
获取请求范围,然后使用curl_setopt
- CURLOPT_RANGE
将其设置为卷曲请求。我遇到的问题是,远程服务器以206 Partial Content
状态和Content-Range
标题进行响应,但我的PHP页面仅响应200 OK
和Content-Range
,因此结果是客户认为已完成的部分文件。问题是,我如何在PHP中设置Content-Range
到原始请求?如何使用PHP/cURL代理请求并代理响应头呢?
如果我知道前面的范围,我不知道,我可以使用header
命令并完成它,但范围返回响应中。我可以设置curl接收所有标题的内容,然后解析出标题,使用header
设置它,并将响应设置为206,然后回显所有数据......但数据是二进制的,更不用说非常大,所以这看起来不是最佳的。
我想知道如果我能以某种方式在PHP中设置一个选项,不发送任何它自己的头,基本上只是将整个响应回显给请求者。如果没有充分考虑这一点,它可能会与其他标题,但缓存,连接,代理等问题。
也许有一种方法,我可以从curl只接收标题(某种partial_execute?),得到我需要设置头文件和响应代码,然后基本完成exec和实际响应get的输出直接?我无法从卷曲中看到如何实现这一目标。
由于PHP脚本实际上确定资源的目标服务器(它不是静态的),所以设置实际的反向代理也不是真正的选项。
我想我可以跳过使用curl并直接执行TCP/TLS连接并管理HTTP请求/响应。
任何其他想法或可能性?谢谢!
我有一个客户机和2台服务器,代理服务器和实际的服务器:C-> P-> S上。客户端通过Range标题请求部分内容。代理使用curl将请求传递给服务器。服务器正确回应206部分内容。但是,PHP代理响应的返回值为200 OK,因此它看起来像代理服务器一样忽略了请求的部分内容,并且实际上只是部分响应。不知何故,我需要curl和PHP返回,它已经满足了正确的部分响应。 – mark
对此,仍然不是100%肯定的,但在我看来,您正在通过一台服务器请求206头,然后从另一台服务器发送它。您是否不需要执行如下的操作:<?php header(“HTTP/1.0 206 Partial Content”); ?> –
你是对的,我可以像你说的强制响应代码,但据我所知,我不能从主服务器的响应中获取Content-Range来放置该标头。我可以让curl返回头文件,但它也会返回所有的内容(我宁愿没有一个大的字符串)......我没有看到没有获取头文件的方法。最后,我最终成功地使用了stream_socket_client而不是curl;我会在这个问题上回答这个问题,以防其他人绊倒这个。 – mark