如何使用 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 请求?的主要内容,如果未能解决你的问题,请参考以下文章