Redirection PHP avec Paramètres Post

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

  • La forme préremplie soumise automatiquement sur votre exemple pourrait fonctionner, mais comme vous l'avez écrit, ce n'est pas vraiment une bonne pratique et peut laisser les utilisateurs sur une page vierge
  • Recevez les arguments GET et POST-les avec curl (ou n'importe quel client http décent) vers le deuxième site, puis transférez le résultat vers le navigateur. C'est ce qu'on appelle un proxy et peut être une bonne solution.
  • Le partage de session à travers le domaine, cela ne peut pas être possible sur toutes les configurations et peut être complexe. Une fois la configuration terminée, le partage de session est presque transparent au code php. Si vous avez plus d'un besoin de communication entre les 2 domaines, cela peut valoir la peine de le faire.

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:

  • Sécurité: la chaîne de requête doit être filtrée ou recréée pour transmettre uniquement les paramètres nécessaires, et vous devez affirmer que le serveur sur le domaine 2 a renvoyé un code HTTP 200.
  • La logique d'application devrait nécessiter peu d'ajustement sur cette partie: si l'application de domaine 2 s'attend à obtenir des données de publication dans la même demande que le visiteur, elle ne le fera pas. Du point de vue du domaine 2, le client qui effectue une demande POST sera le serveur d'hébergement du domaine 1 et non le navigateur du client, il est important que l'IP du client soit important ou que les autres vérifications des clients soient effectuées sur le domaine 2. Si la demande POST sert à afficher un contenu spécifique au client, vous A également dû faire un suivi sur le côté du serveur pour combiner les données publiées précédemment et le visiteur étant redirigé.

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,

  1. Vous pouvez utiliser GET à la place si la destination accepte POST ou GET.
  2. Nous ajoutons un bouton dans de rares cas où le Javascript est désactivé.

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:

  1. Vérifie la saisie avec javascript. Si OK, il l'envoie, sinon affiche une alerte.
  2. Vérifie l'entrée avec php. Si OK, il crée les en-têtes de redirection et se débarrasse du corps HTML, sinon il montre la même forme à nouveau.

Notez que:

  1. Les entrées doivent être vérifiées sur le serveur, car les entrées d'un navigateur peuvent être manipulées de façon néfaste.
  2. Aucun HTML ne peut être publié avant les commandes d'en-tête, car ils seront ignorés avec un avertissement php.
  3. Javascript ne peut que vérifier les entrées pour des valeurs valides, mais sans AJAX, ne pourra pas vérifier le serveur pour ce que l'utilisateur souhaite avant la soumission. Par conséquent, cette méthode est le processus complet non javascript.
  4. Aucun HTML n'est nécessaire si la cible de redirection (comme PayPal) ne traite que les données POST. Les cibles pour les humains, bien sûr!
  5. Malheureusement, 4 signifie que vous ne pouvez pas envoyer un seul sous-ensemble ou même un ensemble complet de valeurs à la nouvelle URL, et que la page cible traite les données POST ouvertes dans le navigateur de l' utilisateur . Vous ne pouvez pas le faire en manipulant le tableau $ _POST (il semble que ce ne soit qu'une copie PHP des données réelles). Peut-être que quelqu'un sait comment modifier le jeu de données POST réel?
  6. À partir de 5, il n'y a pas de possibilité de recueillir des informations privées sur le formulaire original, et il suffit d'envoyer uniquement les informations de paiement sur le formulaire à PayPal ou à quiconque, via le navigateur de l'utilisateur pour obtenir son approbation explicite. Cela signifie que AJAX est nécessaire pour le faire en utilisant deux formes, l'une contenant les informations privées sans bouton, et l'autre forme avec le bouton d'achat PayPal qui utilise AJAX pour soumettre l'autre formulaire, et selon le résultat, soumettre son propre formulaire . Vous pouvez utiliser les champs que PayPal n'utilise pas, mais ils obtiennent toujours l'information et nous ne savons pas ce qu'ils ont parcouru sur les données de formulaire soumises.
  7. Plutôt que d'utiliser AJAX comme dans 6, il serait beaucoup plus simple d'avoir 3 versions de la forme:
    1. Initial pour capturer les données privées.
    2. En cas de problème, re-afficher le formulaire avec les données soumises et l'indication de données incorrectes ou de problèmes de back-end.
    3. Si OK, un formulaire PayPal, soumis automatiquement par javascript au bas de la page (form.submit ()), ou une demande de soumission manuelle par un bouton si aucun javascript.
 <?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'); }