J'ai une page Web. Cette page Web redirige l'utilisateur vers une autre page Web, plus ou moins de la manière suivante:
<form method="post" action="anotherpage.php" id="myform"> <?php foreach($_GET as $key => $value){ echo "<input type='hidden' name='{$key}' value='{$value}' />"; } ?> </form> <script> document.getElementById('myform').submit(); </script>
Eh bien, vous voyez, ce que je fais, c'est transférer les params GET dans les paramètres POST. Ne me dites pas que c'est mauvais, je le sais moi-même, et ce n'est pas exactement ce que je fais vraiment, ce qui importe, c'est que je collectionne des données à partir d'un tableau et essaye de le soumettre à une autre page via POST. Mais si l'utilisateur a JavaScript désactivé, cela ne fonctionnera pas. Ce que j'ai besoin de savoir: existe-t-il un moyen de transférer des paramètres POST au moyen de PHP, afin que la redirection puisse se faire de manière PHP (en- header('Location: anotherpage.php');
) aussi?
Il est très important pour moi de passer les params via POST. Je ne peux pas utiliser la variable $ _SESSION parce que la page Web est sur un autre domaine, donc les variables $ _SESSION diffèrent.
Quoi qu'il en soit, j'ai simplement besoin d'un moyen de transférer des variables POST avec PHP ^^
Merci d'avance!
Aucune possibilité de le faire directement à partir du serveur, car les données POST doivent être envoyées par le navigateur.
Dd MarcoTeaMMMMMTMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
Exemple avec la solution curl, code à exécuter sur le domaine 1:
//retrieve GET parameters as a string like arg1=0&arg1=56&argn=zz $data = $_SERVER['QUERY_STRING']; // Create a curl handle to domain 2 $ch = curl_init('http://www.domain2.com/target_script.php'); //configure a POST request with some options curl_setopt($ch, CURLOPT_POST, true); //put data to send curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //this option avoid retrieving HTTP response headers in answer curl_setopt($ch, CURLOPT_HEADER, 0); //we want to get result as a string curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //if servers support is and you want result faster, allow compressed response curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); //execute request $result = curl_exec($ch); //show response form domain 2 to client if needed echo $result;
Voilà, le navigateur de votre client ne verra même pas le serveur de domaine 2, il n'en obtiendra qu'un résultat. Sachez si vous souhaitez rediriger le client vers le domaine, faites-le avec l'en-tête HTTP classique.
header('Location: http://www.domain2.com');
Bien sûr, c'est un code de démonstration avec des valeurs codées, et il vous reste 2 points:
J'espère qu'il est plus clair maintenant et vous aidera
Vous pouvez l'en-tête rediriger une demande POST, et inclure les informations POST. Cependant, vous devez renvoyer explicitement le code d'état HTTP 307. Les navigateurs traitent 302 comme une redirection avec pour GET, en ignorant la méthode d'origine. Ceci est indiqué explicitement dans la documentation HTTP:
Pratiquement, cela signifie en PHP que vous devez définir le code d'état avant l'emplacement de redirection:
header('HTTP/1.1 307 Temporary Redirect'); header('Location: anotherpage.php');
Cependant, notez que selon la spécification HTTP, l'agent utilisateur DOIT demander à l'utilisateur s'il est correct de renvoyer les informations POST à la nouvelle URL. Concrètement, Chrome ne demande pas, et Safari, mais Firefox présentera à l'utilisateur une boîte contextuelle confirmant la redirection. En fonction de vos contraintes d'exploitation, peut-être que cela est correct, bien que dans un cas d'utilisation générale, il soit certainement susceptible de provoquer une confusion pour les utilisateurs finaux.
Cela peut être fait en utilisant php cUrl lib.
Vérifiez ceci: http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html
Merci Sourabh
C'est possible. Dans cette situation, j'utiliserais cURL:
$url = 'http://domain.com/get-post.php'; foreach($_GET as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string,'&'); //open connection $ch = curl_init(); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST,count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); //execute post $result = curl_exec($ch); //close connection curl_close($ch);
Rangez vos données dans une session, puis utilisez GET.
Non. Vous ne pouvez pas effectuer une redirection d'en-tête avec POST. Vous avez 2 options,
Voici un exemple,
<noscript> <div> <input type="submit" value="Continue"/> </div> </noscript>
Cela affichera un bouton de continuité si Javascript est désactivé afin que l'utilisateur puisse cliquer pour continuer.
Comme un exemple de ce que @Charles indique, voici un formulaire de travail php PayPal buy qui:
Notez que:
<?php // GET POST VARIABLES, ELSE SET DEFAULTS $sAction=(isset($_POST['action'])?$_POST['action']:''); $nAmount=(int)(isset($_POST['action'])?$_POST['amount']:0); // TEST IF AMOUNT OK $bOK=($nAmount>=10); /* TYPICAL CHECKS: 1. Fields have valid values, as a backup to the javascript. 2. Backend can fulfil the request. Such as whether the requested stock item or appointment is still available, and reserve it for 10-15 minutes while the payment goes through. If all OK, you want the new URL page, such as PayPal to open immediately. */ // IF OK if($bOK){ // CHANGE HEADER TO NEW URL $sURL='https://www.paypal.com/cgi-bin/webscr'; header('HTTP/1.1 307 Temporary Redirect'); header('Location: '.$sURL); } ?> <!DOCTYPE html> <html> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>Sample post redirection</title> </head> <body> <?php // IF NO ACTION OR NOT OK if(($sAction=='')||!$bOK){ ?> <h1>Sample post redirection</h1> <p>Throw money at me:</p> <form name="pp" action="<?=$_SERVER['REQUEST_URI']?>" method="post" onsubmit="check_form(this)"> <!-- <input type="hidden" name="amount" value="<?=$nAmount?>" /> --> <input type="hidden" name="business" value="[email protected]" /> <input type="hidden" name="cmd" value="_xclick" /> <input type="hidden" name="lc" value="AU" /> <input type="hidden" name="item_name" value="Name of service" /> <input type="hidden" name="item_number" value="service_id" /> <input type="hidden" name="currency_code" value="AUD" /> <input type="hidden" name="button_subtype" value="services" /> <input type="hidden" name="no_note" value="0" /> <input type="hidden" name="shipping" value="0.00" /> <input type="hidden" name="on0" value="Private" /> <input type="hidden" name="os0" value="Xxxx xxxxx xxxxx" /> <p>Amount $<input id="amount" type="text" name="amount" value="<?=$nAmount?>" /> $10 or more.</p> <p><button type="submit" name="action" value="buy">Buy</button></p> </form> <p>If all is OK, you will be redirected to the PayPal payment page.<br /> If your browser requires confirmation, click the <cite>OK</cite> button.</p> <script> // JS AT END OF PAGE TO PREVENT HTML RENDER BLOCKING // JS FUNCTION FOR LOCAL CHECKING OF FIELD VALUES function check_form(oForm){ // USE TO DETERMINE IF VALUES CORRECT var oAmount=document.getElementById('amount'); var nAmount=oAmount.value; var bOK=true; var bOK=(nAmount>=10); // EXAMINE VALUES // IF NOT OK if(!bOK){ // INDICATE WHAT'S WRONG, ALERT ETC alert('Stingy @$#&. Pay more!!'); // BLOCK FORM SUBMIT ON ALL BROWSERS event.preventDefault(); event.stopPropagation(); return false; } } </script> <?php } ?> </body> </html>
Dans une situation POST Redirect GET (voir https://en.wikipedia.org/wiki/Post/Redirect/Get ), il est acceptable d'utiliser la variable de session comme méthode de transport des données.
<?php session_start(); // return is the name of a checkbox in the post-redirect-get.php script. if(isset($_POST['return'])) { // We add some data based on some sort of computation and // return it to the calling script $_SESSION['action']="This string represents data in this example!"; header('location: post-redirect-get.php'); }