【问题标题】:PHP forward data postPHP转发数据帖子
【发布时间】:2011-09-05 00:32:55
【问题描述】:

我试图在不使用 cURL 的情况下将数据从一个页面转发到另一个页面,这可能吗?

目前我已经尝试过

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

这很好用,但弹出一个愚蠢的框,还有其他方法吗?

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

【问题讨论】:

  • 转发数据?您发布的标头调用只是进行重定向,而不使用 cURL。我错过了什么吗?
  • @stefgosselin:显然是“没有”这个词。
  • 是的,我知道他们做了一个简单的重定向,但它会携带数据。唯一的问题是它会给出一个愚蠢的弹出框来提醒用户
  • @Lunar:以什么标准衡量它“愚蠢”?
  • @Lunar - 查看来自 netcoder 的链接。您的选择实际上是将其存储在 SESSION 变量中或将 POST 数据附加到 URL 并将其作为 GET 字符串读取。

标签: php


【解决方案1】:

我认为以下是实现该目标的唯一可能方法,而不是使用位置标头重定向,而是发送此 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 对于表单提交不是很健壮,最好使用服务器端脚本。
  • @stefgosselin:那么你建议用 PHP 编写什么来转发 POST 数据?
  • @MarcoDemaio - 请参阅下面的答案。尽管我的回答被否决了,但我倾向于支持服务器端处理重定向。
【解决方案2】:

您可以使用以下内容将帖子数据转发到另一个网址。请注意,响应被捕获在 $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);

【讨论】:

  • 您可以输入return $data; 并有效地包装 POST 调用吗?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    使用 cURL 或 fopen() 是常见的建议,但它们实际上都不会将用户“转发”到其他页面。

    要真正将用户转发到具有完整 $_POST 数据的另一个页面,您可以动态创建一个中间页面,其中包含一个带有发布数据的表单和立即提交表单的 JS 代码(以及一个按钮或链接来提交如果用户没有启用 JS,则表单)。

    然后您将用户转发到该中间页面,它会将用户转发到目标页面,#_POST 数据保持不变。如果中间页面没有可见内容,用户就不会知道它的存在。

    目标页面可以取消链接中间页面,因此没有重新提交的机会。

    【讨论】:

      【解决方案5】:

      也许,只是也许你可以这样尝试:

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

      【讨论】:

      • 标头调用不会发送数据,除非您在 url 末尾设置变量,例如 GET .. header("Location: new-location.php?var1=$var1&var2=$ var2");丑陋但它会工作。您也可以使用会话。
      • 那你还没有回答问题。 :)
      • 我可以收集到的内容有 2 个选择,上面发布的 javascript(我不推荐)或会话。
      • "标头调用不会发送数据,除非您在 url 末尾设置变量,例如 GET .. header("Location: new-location.php?var1=$var1&var2= $var2"); 丑陋但它会工作。你也可以使用会话。“这最终对我有用,谢谢
      • @Lunar - 如果这对你有用,也许将答案设置为最喜欢的答案?。所选的解决方案目前依赖于 javascript,虽然它的工作原理似乎不如 100% 服务器端重定向强大。
      猜你喜欢
      • 1970-01-01
      • 2016-11-21
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      相关资源
      最近更新 更多