PHP转发数据POST

11

我想在不使用cURL的情况下将数据从一个页面转发到另一个页面,这是否可行?

目前我已经尝试过:

header('HTTP/1.1 307 Temporary Redirect');
header('Location: new-location.php');

这个方法可行,但会弹出愚蠢的弹窗,还有其他方法吗?

我尝试使用curl,但没有任何反应,不确定我的服务器是否启用了它!


2
转发数据?您发布的标题调用只是重定向,并且不使用cURL。我有什么遗漏吗? - Stephane Gosselin
1
“without”这个词,显然。 - Lightness Races in Orbit
@Lunar:按照什么标准来说它是“愚蠢”的? - Lightness Races in Orbit
你在哪里看到弹出窗口?它显示了什么? - Ibu
1
@Lunar - 看一下netcoder的链接。你的选择现实地是将其存储在SESSION变量中或将POST数据附加到URL上并将其读取为GET字符串。 - Jared Farrish
显示剩余8条评论
5个回答

14
我认为以下是实现此目的仅有的可能方式,与其使用定位标头(location header)进行重定向,发送以下HTML代码:-
<!DOCTYPE html>
<html>
    <body onload="document.forms[0].submit()">
        <form action="new-location.php" method="post">
            <?php foreach( $_POST as $key => $val ): ?>
                <input type="hidden" name="<?= htmlspecialchars($key, ENT_COMPAT, 'UTF-8') ?>" value="<?= htmlspecialchars($val, ENT_COMPAT, 'UTF-8') ?>">
            <?php endforeach; ?>
        </form>
    </body>
</html>

JavaScript 对于表单提交不是非常健壮,最好使用服务器端脚本来处理。 - Stephane Gosselin
3
@stefgosselin:那么您建议编写什么样的PHP代码以便转发POST数据呢? - Marco Demaio
@MarcoDemaio - 请看下面我的回答。虽然我的回答被downvote了,但我倾向于使用服务器端处理重定向。 - Stephane Gosselin

14

你可以使用以下方法将POST数据转发到另一个URL。请注意,响应被捕获在$data变量中,您可以随意处理。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.domain.tld/urltopostto.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
$data = curl_exec($ch);
curl_close($ch);

1
你能否只是加上 return $data; 并有效地包装POST调用? - Andrew Wyld

2

如果我理解问题正确,并且您正在使用启用了mod_rewrite的Apache服务器,您可以使用URL重写。您可以将请求方法设置为条件,并将原始URL重写为备用URL:

RewriteCond %{REQUEST_METHOD} ^POST
RewriteRule ^index.php new-location.php [L]

1
使用cURL或fopen()是常见的建议,但它们都没有真正地“转发”用户到另一个页面。
为了真正将用户转发到另一个页面并保持$_POST数据不变,您可以动态创建一个中间页面,其中包含一个带有post数据和JS代码的表单,该代码会立即提交表单(如果用户没有启用JS,则还需要提供一个按钮或链接来提交表单)。
然后,您将用户转发到该中间页面,并且该页面将用户转发到目标页面,并保持#_POST数据不变。如果中间页面没有可见内容,用户将不知道其存在。
目标页面可以取消与中间页面的链接,以确保不会重新提交。

-2

也许,你可以试试这种方式:

header("Status: 200");
header("Location: new-location.php");
exit;

2
一个头部调用不会发送数据,除非你在URL末尾设置变量,就像GET一样。header("Location: new-location.php?var1=$var1&var2=$var2");虽然有点丑陋,但它可以工作。你也可以使用会话。 - Stephane Gosselin
2
那么你还没有回答这个问题。 :) - Jared Farrish
据我所知,您有两个选择,一个是如上所述的JavaScript(我不建议),另一个是会话。 - Stephane Gosselin
一个标题呼叫不会发送数据,除非你在URL末尾设置变量,比如GET .. header("Location: new-location.php?var1=$var1&var2=$var2");丑陋但可行。你也可以使用会话。最终这对我起作用了,谢谢。 - Lunar
@Lunar - 如果这对您有效,请将其设置为优选答案。当前选择的解决方案仅依赖于JavaScript,尽管它可以工作,但似乎不如100%服务器端重定向稳健。 - Stephane Gosselin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接