2010-05-08 163 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