【问题标题】:Redirect with the same form/request values (POST)使用相同的表单/请求值重定向 (POST)
【发布时间】:2012-07-06 12:38:59
【问题描述】:

是否可以重定向到另一个页面,比如 add.php 与发送到原始页面的请求。

假设我有一个文件:form.html,它有一个发布表单 现在我将其提交给 form.php。

我希望 form.php 将请求重定向到 add.php,以便 add 接收与 form.php 相同的 POST 参数

这样做是为了 form.php 可以分析一个名为 action 的隐藏字段,并根据其值重定向到 add.php 或 edit.php 。我知道这可以通过更改 form.action 属性在 javascript 中完成。我想知道服务器端是否有可能

【问题讨论】:

  • 你为什么没有一个文件呢?既可以处理编辑也可以添加
  • 为什么不直接使用include()/require()?提交到 form.php,然后根据请求的操作包含相关脚本。
  • 嗯,这是我对应用程序的要求。
  • 如果添加和编辑与同一模型相关,例如添加编辑页面/cms,那么最好将其放在单个控制器/页面中,imo 类似这样的内容应该与空白 @ 987654323@通过url结构判断是编辑还是添加如example.com/page/addexample.com/page/edit/id
  • 我知道,但实际要求是转发到不同的域:所以页面在 example.com 上,它将重定向到 example2.com 或 example3.com;所以这是一个执行工作的外部脚本。这有点疯狂,但这是我的要求

标签: php http


【解决方案1】:

您可以在 switch 或 if 块中简单地 require_once。 如果您确实需要实际重定向(即您希望用户知道他们被重定向到的位置),您可能需要发送一个“假”中间页面,并带有自动-提交(通过javascript)充满隐藏输入的表格。

原因就在the HTTP spec

如果收到 302 状态代码以响应 GET 或 HEAD 以外的请求,用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变请求被执行的条件发布。

【讨论】:

  • 所以如果我做一个 302 重定向,它会与用户确认然后转发值
  • 这并不完全可靠...这只是规范作者的意图...您只有一个保证(通过“不得”的措辞),它不会 自动重新提交您的表单。
  • 我的回答中也提到了可靠的方法(如果需要不起作用):发送一个自提交表单的回复。根据我的经验,大约 2-4 年前的某个时候,我们都开始认为假设我们的用户使用 javascript 是相对安全的。
  • 是的,但我只是想知道它是否可以在服务器端完成。我有一个更改 javascript 的操作,我用它来确定它应该发送到哪个操作。我只是想知道是否有服务器端故障保护
【解决方案2】:

在您的 form.php 中为 form.html 中的每个表单值声明隐藏字段并从发布数据中分配值

//form.php
<form name="newform" action="add.php" method="POST">
    <input type="hidden" name="field1" value="<?php echo(@$_POST['field1']); ?>" />
    ... declare other hidden fields like above
    ... field1 represent post value from the previous page form.html

</form>

<?php
    if(editConditionSatisfied)
    {
       echo '
          <script type="text/javascript">
             document.forms["newform"].action = "edit.php";
             document.forms["newform"].submit();
          </script>
       ';
    }
    else
    {
       echo '
          <script type="text/javascript">
             document.forms["newform"].action = "add.php";
             document.forms["newform"].submit();
          </script>
       ';
    }
?>

在写出脚本之前,您可以确保所有条件和过程都已发生。该脚本在您将它们写出并将您的数据重新提交到您想要的位置后才会生效

希望有帮助

【讨论】:

  • 正如我所说,我知道 javascript 解决方案。我只是想知道是否有服务器端故障保护
  • 没问题。我发布是因为您的评论“好的,谢谢。所以现在可以可靠地做到这一点
【解决方案3】:

您还可以根据您的逻辑使用 cURL 向 edit.php 或 add.php 从 form.php 发出 POST 请求。

form.php

$value1 = $_POST["field1"];
//assuming your field names are field1 etc..
//assign variables for all fields.

$body = "field1=".value1."&field2=".value2;
//etc for all field/value pairs
//to transmit same names to edit.php or add.php

//pseudo code for condition based on $_POST["action"]
if(condition TRUE for add.php){
    $url = "example2.com/add.php";
} elseif((condition TRUE for edit.php){
     $url = "example3.com/edit.php";
}

if(isset($url)){     //most probably true, but just for safe-guard
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);            //we are making POST request
    curl_setopt($ch, CURLOPT_POSTFIELDS, $body);  //setting the POST fields
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
}

//do something based on $response
//like doing a simple header redirect to $url

现在,您的 add.php 或 edit.php 将与收到 POST 表单请求完全一样。

让它们都在 200(成功)或 404(失败)中发送响应,以便您可以在 $response 中捕获它并根据需要继续。

请注意,我假设用户输入已经过清理。 (在将任何内容分配给 $value1 之前,您应该在 form.php 的顶部)

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多