如何使用 PHP 转发/重定向 HTTP PUT 请求?

Posted

技术标签:

【中文标题】如何使用 PHP 转发/重定向 HTTP PUT 请求?【英文标题】:How to forward/redirect an HTTP PUT Request with PHP? 【发布时间】:2010-05-08 00:57:23 【问题描述】:

我在服务器上收到 HTTP PUT 请求,我想将这些请求重定向/转发到其他服务器。

我用 php 在两台服务器上处理 PUT 请求。

PUT 请求正在使用基本 HTTP 身份验证。

这是一个例子:

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

重定向到

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

如何在不将文件保存在我的第一台服务器上并使用 CURL 重新发送 PUT 请求的情况下执行此操作?

谢谢!

【问题讨论】:

【参考方案1】:

HTTP/1.1 为此类重定向定义了状态码 307。但是,PUT 通常由客户端软件使用,您几乎可以假设没有人尊重 307。

执行此操作的最有效方法是在 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);

【讨论】:

文件> 32MB左右不会溢出内存吗?无论如何为sn-p +1。没想到php://input 有没有办法在不将整个文件加载到 php 变量中的情况下做到这一点? 我不知道。问题是 CURL 没有办法流式传输 PUT 正文。如果不阅读整个输入,您将不知道 INFILESIZE。如果内存使用是一个问题,您可以将“php://memory”更改为“php://temp”。【参考方案2】:

不可能。重定向隐含地是 GET 请求。您需要使用curl 为代理玩游戏。

从技术上讲,保存在磁盘上也不是必需的,您可以将响应正文直接通过管道传输到 Curl 的请求正文。但由于我从来没有在 PHP 中这样做过(在 Java 中这是小菜一碟),所以我无法给出更详细的答案。

【讨论】:

谢谢!有人知道如何用 php 传递响应正文吗? 重点:你应该直接将获得的文件写入curl而不是本地文件。这已经节省了将其写入本地磁盘文件系统的不必要步骤。但是 PHP 会首先将整个文件隐式保存在内存或任何其他临时存储中。它可能是可配置的,但我不确定。

以上是关于如何使用 PHP 转发/重定向 HTTP PUT 请求?的主要内容,如果未能解决你的问题,请参考以下文章

重定向,请求转发,get,post

使用php的http到https转发

如何在 HTTP 重定向上转发标头

php 后台转发和重定向的区别及kohana框架当前url加参数方式

如何使用haproxy进行url路径重定向,非域名跳转

HTTP中的重定向和请求转发的区别