重定向POST请求并保留数据.可能的


Redirect POST request and keep data. Possible?

我的问题很简单。我需要将文件直接上传到正确的服务器(目前工作负载较低)。

所以我做:

<?php
$server = file_get_contents('http://my-api.com/upload-server.php'); // returns url
?>

然后像

一样打印表单
<form method="post" action="<?php echo $server; ?>"...

现在我想把这一步移到上传开始时,像这样:

<form method="post" action="http://my-api.com/upload-gateway.php"...

这个url应该重定向到真正的服务器。

所以上传页面不会减慢加载速度,我有静态的html代码,我可以缓存,嵌入等…

问题是,这与get请求工作得很好,但不与post请求。

当使用location头重定向时,请求似乎被转换为get请求。所有post数据将丢失。

这是不可能的还是我做错了?是的,我考虑了一个远程动态javascript,它首先用正确的服务器打印html代码。我宁愿不那样做。

任何想法?也许有其他的上传技术?

编辑:

这是我使用的确切的HTML代码:

<form method='post' enctype='multipart/form-data' action='http://storage.ivana.2x.to/rest.php?action=target'> 
<input type=hidden name=testfield value="test">
File to upload: <input type=file name=upfile><br> 
Notes about the file: <input type=text name=note><br> 
<br> 
<input type=submit value=Press> to upload the file!
</form> 

这是我使用的重定向代码:

if($_GET["action"] == "target") {
    header("Location: http://storage.ivana.2x.to/rest.php?action=test");
}

这是我用来查看结果的输出代码:

if($_GET["action"] == "test") {
    echo "<pre>";
    var_dump($_POST);
    var_dump($_GET);
    var_dump($_FILES);
}

上传小文件的结果如下:

array(0) {
}
array(1) {
  ["action"]=>
  string(4) "test"
}
array(0) {
}

如果您真的想通过代码实现负载平衡,同时可能会缓存带有上传表单的页面,请首先选择默认下载服务器(url);然后,onSubmit调用服务器,找到最佳上传目标,并相应地调整action属性。

使用此方法,未激活JS的用户仍然可以获得他们想要的,启用JS的用户可以获得更好的上传目标,并且您仍然可以缓存。此外,缓存请求的时间可能更有机会,因为URL请求将在实际上传之前不久发生。

唯一的障碍将是获取URL的调用,与您上面描述的过程相比,您可以更容易地对其进行性能调整(我认为)。在我看来,通过头指令和/或cURL调用上传文件两次似乎不像是缓存单个html文件的一个很好的权衡。但我也不知道你面对的是什么。

如果您不想大量管理服务器环境并引入负载平衡,那么我建议您使用此选项。

您可以尝试返回代码302(临时移动),而不是100%,这会让您的浏览器将数据发布到更改后的url,但这是值得检查的东西。

[编辑]

根据这篇维基百科文章,POST数据将被转换为GET,这可能不适用于文件上传。

这不是一个好的解决方案。该文件将在PHP脚本启动之前完整地上传。这意味着,如果您成功地完成了您尝试做的事情,客户端将不得不上传文件两次!

我建议您在创建表单时尝试找出将请求发送到哪台服务器,因此表单标记中的action属性将直接指向加载较少的机器。

或者更好:使用服务器端负载均衡器,使您的HTTP基础设施对浏览器透明。

我可能错了,但是…你的表单的动作点到?action=target和在你的rest.php你做一个标题到"?action=test"当然你不会找到你的$POST或$FILES!a header()不发送这些变量..

如果你想把你的帖子和文件发送到另一个位置,你需要使用cUrl库。但这并不容易:)

好运