你不能用PHP做这个。
正如其他人所说,你可以使用cURL – 但是然后PHP代码成为客户端,而不是浏览器。
如果您必须使用POST,那么唯一的方法就是使用PHP生成填充表单,并使用window.onload挂钩来调用javascript来提交表单。
C。
这里是解决方法示例。
function redirect_post($url, array $data) { ?>
<?php if ( !is_null($data) ) { foreach ($data as $k => $v) { echo ' '; } } ?> <?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 go back";
一个旧的职位,但这里是我如何处理它。 使用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”进行重定位:
<?php session_start(); $_SESSION['val1'] = val1; ... $_SESSION['valn'] = valn; header('Location: http//Page-to-redirect-to'); ?>然后,在目标页面中:
<?php session_start(); ?> ...
<?php if (isset($_SESSION['val1']) && ... && isset($_SESSION['valn'])) { YOUR CODE HERE based on $_SESSION['val1']...$_SESSION['valn'] values } ?>不需要Javascript和JQuery ..祝你好运!