PHP – redirect并通过POST发送数据

我有一个在线网关,需要一个HTML表单提交与隐藏的领域。 我需要通过一个PHP脚本没有任何HTML表单(我有数据库中的隐藏字段的数据)

要通过GET发送数据:

header('Location: http://www.provider.com/process.jsp?id=12345&name=John'); 

并通过POST发送数据?

你不能用PHP做这个。

正如其他人所说,你可以使用cURL – 但是然后PHP代码成为客户端,而不是浏览器。

如果您必须使用POST,那么唯一的方法就是使用PHP生成填充表单,并使用window.onload挂钩来调用javascript来提交表单。

C。

这里是解决方法示例。

 function redirect_post($url, array $data) { ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type="text/javascript"> function closethisasap() { document.forms["redirectpost"].submit(); } </script> </head> <body onload="closethisasap();"> <form name="redirectpost" method="post" action="<? echo $url; ?>"> <?php if ( !is_null($data) ) { foreach ($data as $k => $v) { echo '<input type="hidden" name="' . $k . '" value="' . $v . '"> '; } } ?> </form> </body> </html> <?php exit; } 

另一种解决scheme,如果你想避免curl调用,并让浏览器像正常的redirect,并模仿POST调用:

保存post并做一个临时redirect:

 function post_redirect($url) { $_SESSION['post_data'] = $_POST; header('Location: ' . $url); } 

然后总是检查会话variablespost_data

 if (isset($_SESSION['post_data'])) { $_POST = $_SESSION['post_data']; $_SERVER['REQUEST_METHOD'] = 'POST'; unset($_SESSION['post_data']); } 

会有一些缺less的组件,如apache_request_headers()不会显示POST内容头等。

这将涉及cURL PHP扩展。

 $ch = curl_init('http://www.provider.com/process.jsp'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "id=12345&name=John"); curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); // RETURN THE CONTENTS OF THE CALL $resp = curl_exec($ch); 
 /** * Redirect with POST data. * * @param string $url URL. * @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123) * @param array $headers Optional. Extra headers to send. */ public function redirect_post($url, array $data, array $headers = null) { $params = array( 'http' => array( 'method' => 'POST', 'content' => http_build_query($data) ) ); if (!is_null($headers)) { $params['http']['header'] = ''; foreach ($headers as $k => $v) { $params['http']['header'] .= "$k: $v\n"; } } $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if ($fp) { echo @stream_get_contents($fp); die(); } else { // Error throw new Exception("Error loading '$url', $php_errormsg"); } } 

使用curl为此。 谷歌的“curlPHP的post”,你会发现这个: http : //www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html 。

请注意,您也可以使用CURLOPT_POSTFIELDS选项的数组。 从php.net文档:

完整的数据在HTTP“POST”操作中发布。 要发布文件,请使用@预先指定文件名并使用完整path。 这可以作为urlencodedstring(比如“para1 = val1&para2 = val2&…”)传递,也可以作为字段名称作为键和字段数据作为值的数组传递。 如果value是一个数组,则Content-Type头将被设置为multipart / form-data。

或者,在redirect之前设置会话variables并在目标url中testing它,可以为我解决这个问题。

您必须使用fsockopen打开一个到该站点的套接字并模拟HTTP-Post-Request。 谷歌会告诉你很多片段如何模拟请求。

恐怕你需要CURL来完成这个任务。 很简单的方法来做到这一点: http : //davidwalsh.name/execute-http-post-php-curl

希望有所帮助

我使用下面的代码来捕获从form.php提交的POST数据,然后将它连接到一个URL上,将它发送回表单进行validation更正。 像魅力一样工作,实际上将POST数据转换为GET数据。

 foreach($_POST as $key => $value) { $urlArray[] = $key."=".$value; } $urlString = implode("&", $urlArray); echo "Please <a href='form.php?".$urlString."'>go back</a>"; 

一个旧的职位,但这里是我如何处理它。 使用newms87的方法:

 if($action == "redemption") { if($redemptionId != "") { $results = json_decode($rewards->redeemPoints($redemptionId)); if($results->success == true) { $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml?a=redemptionComplete'; // put results in session and redirect back to same page passing an action paraameter $_SESSION['post_data'] = json_encode($results); header("Location:" . $redirectLocation); exit(); } } } elseif($action == "redemptionComplete") { // if data is in session pull it and unset it. if(isset($_SESSION['post_data'])) { $results = json_decode($_SESSION['post_data']); unset($_SESSION['post_data']); } // if you got here, you completed the redemption and reloaded the confirmation page. So redirect back to rewards.phtml page. else { $redirectLocation = $GLOBALS['BASE_URL'] . 'rewards.phtml'; header("Location:" . $redirectLocation); } } 

是的,你可以在PHP中做这个例如

Silex或Symfony3

使用子请求

 $postParams = array( 'email' => $request->get('email'), 'agree_terms' => $request->get('agree_terms'), ); $subRequest = Request::create('/register', 'POST', $postParams); return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false); 

一个解决方法完美的作品:

在源页面中,开始打开会话并分配尽可能多的值。 然后用“header”进行重定位:

 <!DOCTYPE html> <html> <head> <?php session_start(); $_SESSION['val1'] = val1; ... $_SESSION['valn'] = valn; header('Location: http//Page-to-redirect-to'); ?> </head> </html> 

然后,在目标页面中:

 <!DOCTYPE html> <?php session_start(); ?> <html> ... <body> <?php if (isset($_SESSION['val1']) && ... && isset($_SESSION['valn'])) { YOUR CODE HERE based on $_SESSION['val1']...$_SESSION['valn'] values } ?> </body> </html> 

不需要Javascript和JQuery ..祝你好运!