重定向 HTTP 表单帖子

Posted

技术标签:

【中文标题】重定向 HTTP 表单帖子【英文标题】:Redirecting HTTP form post 【发布时间】:2012-10-16 23:23:39 【问题描述】:

一点背景知识:我在一个公共网站上有一个表单,需要将数据发布到我的防火墙后面的 Apache 服务器。我不想提供从 Internet 直接访问此虚拟主机的权限。

目前这是我正在做的事情:我的 DMZ 中有一个 IIS 服务器。此 IIS 服务器是唯一允许通过防火墙访问 Apache 服务器的 IP。作为一个临时解决方案,我使用“应用程序请求路由”设置 IIS,以通过 IIS 将 Apache 框呈现给互联网。

我想做的事: 有一些方法可以捕获并转发表单,而无需将 Apache 盒子展示到互联网上。这里的诀窍是 POST 将来自 Internet 上的任何地方,被 IIS 服务器抓取,然后从 IIS 服务器中继到 apache 盒子。我已经研究过用 php/cURL 来做这件事,但不确定使用这样的东西是否能解决问题:

<?php

$todo = "";

while (list($name, $value) = each($HTTP_POST_VARS)) 
$todo.=$name."=".$value."&";


$ch = curl_init('http://mylanserver/capture.php');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $todo);
curl_exec ($ch);
curl_close ($ch);
?>

有人能指出我正确的方向吗?谢谢。

【问题讨论】:

你在正确的轨道上。我会这样做: 1. 获取原始请求 2. 将其转发到 IIS 服务器。试试这些问题:***.com/questions/1361673/get-raw-post-data***.com/questions/869927/… 是的,你的想法是对的。 CURLOPT_POSTFIELDS 可以直接取$_POST 数组,不需要构造键值字符串。此外,您可能想检查结果,然后向公共用户显示结果的一些解释?如果您将CURLOPT_RETURNTRANSFER 设置为开启,curl_exec() 将返回响应。 好的,上面的代码大部分都可以正常工作。我的表单中有诸如“姓名、电话、电子邮件、邮编”之类的字段,这些字段正在正确传递。基本上任何没有多个值的东西。我有一些带有货币值等的附加字段。当这些字段被传递时,我的后端程序用“数组”填充字段,我需要为每个字段定义一个数组吗?不知道在这里做什么,我的专长是剪切和粘贴。 【参考方案1】:

使用史努比。它会帮助你很多。或者将数据保存在一些临时数据库中,创建一个小型机器人(您可以再次使用 snoopy)并允许它与 Web 服务器通信并按照您的喜好使用数据。在 cron 选项卡中将此机器人安排为 cron。

【讨论】:

【参考方案2】:

我包含的第一条语句工作正常,但没有传递在我的表单上有多个选择选项的值。它只是在字段中填充“数组”。我通过这样做纠正了这一点:

$postParams = file_get_contents("php://input"); 


$ch = curl_init('http://mysite/capture.php');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postParams);
curl_exec ($ch);
curl_close ($ch);

然后我需要将客户端重定向到“谢谢”页面,我的后端程序正在发送这些数据,但我无法让 cURL 使用它,我通过刷新标题和设置来解决这个问题值为 1。像这样:

header("refresh:1;url=http://mythankyoupage");  

感谢您的帮助!

【讨论】:

【参考方案3】:

如果我理解正确,你想发送帖子数据吗?

试试这个:

$url = 'http://server.com/path';
$data = array('key1' => 'value1', 'key2' => 'value2')

// use key 'http' even if you send the request to https://...
$options = array('http' => array(
    'method'  => 'POST',
    'content' => http_build_query($data)
));
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);

您不必自己构建 $data 数组,只需传递 $_POST 数组即可。

【讨论】:

以上是关于重定向 HTTP 表单帖子的主要内容,如果未能解决你的问题,请参考以下文章

表单验证重定向问题

如何将自定义帖子类型的帖子重定向到一个网址?

表单提交后PHP重定向到另一个页面

jQuery ajax 帖子不会重定向到 php 页面

GET 不重定向页面 nodeJS/mongo

如何将我在Http中的所有帖子/页面重定向到Https