Php 重定向HTTP表单post

Php 重定向HTTP表单post,php,html,apache,iis,curl,Php,Html,Apache,Iis,Curl,一点背景: 我在一个公共网站上有一个表单,需要将数据发布到防火墙后面的apache服务器。我不想从internet直接访问此Web主机 目前我正在这样做:我的DMZ中有一个IIS服务器,该IIS服务器是唯一允许通过防火墙访问apache服务器的IP。作为一个临时解决方案,我使用“应用程序请求路由”设置IIS,通过IIS将Apache box呈现给internet *我想做的:*有一些方法可以捕获表单,然后转发表单,而无需将Apache box呈现给internet。这里的诀窍是,帖子将来自互联网

一点背景: 我在一个公共网站上有一个表单,需要将数据发布到防火墙后面的apache服务器。我不想从internet直接访问此Web主机

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

*我想做的:*有一些方法可以捕获表单,然后转发表单,而无需将Apache box呈现给internet。这里的诀窍是,帖子将来自互联网上的任何地方,被IIS服务器抓取,然后从IIS服务器转发到apache box。我已经研究过如何使用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);
?>


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

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

试试这个:

$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数组,只需传递$\u POST数组。

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

$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");  

谢谢你的帮助

使用史努比。这对你会有很大帮助。或者将数据保存在一些临时数据库中,创建一个小机器人(您可以再次使用snoopy),并允许它与web服务器通信,并根据您的喜好播放数据。在cron选项卡中将此bot计划为cron

你在正确的轨道上。我会这样做:1。获取原始请求2。将其转发到IIS服务器。尝试以下问题:是的,你的想法是正确的
CURLOPT_POSTFIELDS
可以直接获取
$\u POST
数组,无需构造键值字符串。您可能还想检查结果,然后向公共用户显示结果的一些解释<如果将
CURLOPT\u RETURNTRANSFER
设置为on,则code>curl\u exec()将返回响应。好的,以上代码在大多数情况下工作正常。我的表单中有一些字段,如“姓名、电话、电子邮件、邮政编码”,这些字段被正确传递。基本上没有多个值。我有一些带有货币值等的附加字段。当这些字段被传递时,我的后端程序用“数组”填充这些字段,我是否需要为每个字段定义一个数组?不知道在这里做什么,我的专长是剪贴。