2010-05-08 159 views
2

我收到服務器上的HTTP PUT請求,我想將這些請求重定向/轉發到其他服務器。如何使用PHP轉發/重定向HTTP PUT請求?

我用PHP處理兩臺服務器上的PUT請求。

PUT請求使用基本的HTTP身份驗證。

下面是一個例子:

www.myserver.com/service/put/myfile.xml 

重定向到

www.myotherserver.com/service/put/myfile.xml 

我怎麼能做到這一點,但不保存我的第一臺服務器上的文件,然後重新發送使用curl PUT請求?

謝謝!

回答

5

HTTP/1.1爲這種重定向定義了狀態碼307。但是,PUT通常由客戶端軟件使用,並且幾乎可以假定沒有人能夠獲得這個獎勵。

執行此操作的最有效方法是在Apache上設置代理以將請求重定向到新URL。

這是怎麼了,你可以代理在PHP中,

$data = file_get_contents('php://input'); 
$mem = fopen('php://memory'); 
fwrite($mem, $data); 
rewind($mem); 
$ch = curl_init($new_url);        
curl_setopt($ch, CURLOPT_PUT, true); 
curl_setopt($ch, CURLOPT_INFILE, $mem); 
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_exec($ch);  
curl_close($ch); 
fclose($meme); 
+0

如果文件大於32MB,會不會溢出內存?無論代碼片段爲+1。沒有考慮'php:// input'。 – BalusC 2010-05-08 02:35:19

+0

有沒有辦法做到這一點,而無需在PHP變量中加載整個文件? – benjisail 2010-05-11 01:26:43

+0

我不知道。問題是CURL沒有方法來流式傳輸PUT體。沒有閱讀整個輸入,你不知道INFILESIZE。如果內存使用是一個問題,您可以將「php:// memory」更改爲「php:// temp」。 – 2010-05-11 02:46:10

2

不可能。重定向隱含地爲GET請求。您需要使用curl代理代理。

保存在磁盤上在技術上也沒有必要,您可以直接將響應體直接傳送到Curl的請求主體。但是由於我從來沒有在PHP中做過這些(Java是一塊蛋糕),所以我無法給出更詳細的答案。

+0

謝謝! 有人知道如何管用PHP的響應身體? – benjisail 2010-05-08 01:38:45

+0

重點:您應該直接將獲取的文件寫入捲曲而不是本地文件。這將節省不必要的步驟將其寫入本地磁盤文件系統。但PHP會隱式地將整個文件保存在內存或任何其他臨時存儲中。它可能是可配置的,但我不確定。 – BalusC 2010-05-08 02:05:01