2012-10-26 73 views
7

稍微背景: 我在公共網站上有一個表單,需要將數據發佈到防火牆後面的apache服務器。我不想直接從互聯網上訪問這個虛擬主機。重定向HTTP表單post

目前這是我在做什麼:我在我的DMZ中有一個IIS服務器,這個IIS服務器是允許通過防火牆訪問Apache服務器的唯一IP。作爲一個臨時解決方案,我使用「應用程序請求路由」來設置IIS,以通過IIS向Internet呈現Apache框。

* 我想要做的事情: *有一些方法可以捕獲然後中繼表單,而不必將Apache盒子呈現給互聯網。這裏的訣竅是POST將來自Internet上的任何地方,被IIS服務器抓取,然後從IIS服務器轉發到apache盒子。我看着與PHP /捲曲這樣做,但我不知道,如果 使用像這樣的事情會做的伎倆:

<?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); 
?> 

有人能指出我在正確的方向?謝謝。

+3

你在正確的軌道上。我會這樣做:1.獲取原始請求2.轉發到IIS服務器。試試這些問題:http://stackoverflow.com/questions/1361673/get-raw-post-data http://stackoverflow.com/questions/869927/php-difference-between-curl-and-httprequest – Brian

+1

是的你有正確的想法。 'CURLOPT_POSTFIELDS'可以直接使用'$ _POST'數組,你不需要構造鍵值字符串。你也許想要檢查結果,然後向公衆用戶顯示結果的一些解釋?如果你設置了'CURLOPT_RETURNTRANSFER','curl_exec()'返回響應。 – MrCode

+0

好吧,上面的代碼大部分工作正常。我有我的表單中的字段,如「姓名,電話,電子郵件,郵編」這些正在正確傳遞。基本上沒有多重價值的東西。我有一些額外的字段與貨幣值等。當這些通過我的後端程序填充「數組」字段我需要爲每個這些字段定義數組?不知道在這裏做什麼,我的專長是Cut&Paste。 – jqapi

回答

0

如果我正確理解你,你想發送發佈數據?

試試這個:

$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陣列上。

3

我包括的第一個聲明正常工作,但沒有傳遞在我的窗體上有多個選擇選項的值。它只是在字段中填充「數組」。我糾正,通過這樣做:

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

感謝您的幫助!

0

使用史努比。它會幫助你很多。或者將數據保存在某個臨時數據庫中,創建一個小型機器人(您可以再次使用snoopy),並允許它與Web服務器進行通信並隨數據一起播放。在cron選項卡中將此機器人安排爲cron。