我有一個瀏覽器客戶端從我的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