Redirection PHP avec paramètres Post

j'ai une page web. Cette page 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 est de transférer les params obtenir dans les params POST. Ne me dites pas que c'est mauvais, je sais que moi-même, et ce n'est pas exactement ce que je fais vraiment, ce qui est important est que je collecte des données à partir d'un tableau et essayer de le soumettre à une autre page via POST. Mais si JavaScript est désactivé, ça ne marchera pas. Ce que j'ai besoin de savoir: Est-il un moyen de transférer les paramètres du POST au moyen de PHP pour que la redirection puisse être faite à la manière de PHP (header('Location: anotherpage.php');), trop?

il est très important pour moi de passer les params par la poste. Je ne peux pas utiliser la variable $_SESSION parce que la page web est sur un autre domaine, donc les variables $_SESSION diffèrent.

de toute façon, j'ai simplement besoin d'un moyen de transférer les variables POST avec PHP ^^

Merci d'avance!

19
demandé sur Mic1780 2010-05-19 16:10:56

9 réponses

aucune possibilité de le faire directement depuis le serveur, car les données POST doivent être envoyées par le navigateur.

Mais vous pouvez choisir une alternative :

  • le formulaire rempli à l'avance automatiquement soumis dans 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 blanche
  • Recevoir OBTENIR les arguments et les afficher avec curl (ou tout décent client http) deuxième site, puis transfert en résultat au navigateur. Cela s'appelle un proxy et peut-être une bonne solution imho.
  • faire 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 pour le code php. Si vous avez plus d'un besoin de communication entre les 2 domaines, il peut être vaut la peine.

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;

C'est tout, le navigateur de votre client ne verra même pas le serveur de domaine 2, il obtiendra seulement en résultent. sachez que si vous voulez rediriger un client vers un domaine, faites-le avec l'en-tête http classique.

header('Location: http://www.domain2.com');

bien sûr, c'est le code de démonstration avec des valeurs codées en dur, et il y a 2 point à gauche de vous :

  • sécurité: la chaîne de requête doit être filtrée ou recréée pour ne transmettre que les paramètres nécessaires, et vous devez affirmer que le serveur du domaine 2 a retourné un code HTTP de 200.
  • la logique D'Application devrait avoir besoin de peu d'ajustement sur cette partie : si le domaine 2 app s'attend à obtenir des données post dans la même requête que le visiteur vient il ne le fera pas. Du point de vue du domaine 2, le client qui fait une requête POST sera un serveur hébergeant le domaine 1 pas le navigateur client, c'est important si les questions D'IP du client ou d'autres vérifications du client sont faites sur le domaine 2. Si la requête POST sert à afficher du contenu spécifique au client, vous devez également effectuer un suivi côté serveur pour combiner des données précédemment publiées avec le visiteur étant redirigé.

j'Espère que c'est plus clair et vous aidera

12
répondu Benoit 2010-05-19 13:37:03

Vous pouvez en-tête rediriger une requête POST, et inclure les informations POST. Cependant, vous devez explicitement retourner le code de statut HTTP 307. Les navigateurs traitent 302 comme une redirection avec pour obtenir, ignorant la méthode originale. Ceci est noté explicitement dans la documentation HTTP:

pratiquement, cela signifie que dans PHP vous devez définir le code d'état avant la redirection emplacement:

    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 ok de resoummettre les informations POST à la nouvelle URL. En termes pratiques, Chrome ne demande pas, et Safari non plus, mais Firefox présentera à l'utilisateur une boîte popup confirmant la redirection. En fonction de vos contraintes d'exploitation, peut-être que c'est correct, bien que dans un cas d'utilisation générale, il a certainement le potentiel de causer de la confusion pour les utilisateurs finaux.

15
répondu Charles 2017-01-10 16:31:24

cela peut être fait en utilisant php cUrl lib.

Cochez cette http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html

Merci, Sourabh

1
répondu Sourabh 2010-05-19 12:19:26

Stockez vos données dans une session puis utilisez GET.

0
répondu ThiefMaster 2010-05-19 12:20:43

Non. Vous ne pouvez pas faire la redirection de l'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 les rares cas où le Javascript est désactivé.

Voici un exemple,

<noscript>
<div>
<input type="submit" value="Continue"/>
</div>
</noscript>

cela affichera un bouton continuer si Javascript est désactivé afin que l'utilisateur puisse cliquer pour continuer.

0
répondu ZZ Coder 2010-05-19 12:41:43

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);
0
répondu DBruns 2010-05-19 13:10:45

comme exemple de ce que @Charles indique, voici un formulaire d'achat php PayPal qui fonctionne:

  1. Vérifie l'entrée avec javascript. Si OK, il le soumet, sinon il 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 affiche à nouveau la même forme.

Remarque:

  1. les Inputs doivent être revérifiés sur le serveur, car les inputs d'un navigateur peuvent être négativement manipuler.
  2. aucun HTML ne peut être sorti avant les commandes d'en-tête, car elles seront ignorées avec un avertissement php.
  3. Javascript peut seulement vérifier les entrées pour les valeurs valides, mais sans AJAX, ne sera pas en mesure de vérifier le serveur pour ce que l'utilisateur veut 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. Cibles pour les humains font, de sûr!
  5. malheureusement, 4 signifie que vous ne pouvez pas envoyer juste un sous-ensemble ou même un autre ensemble complet de valeurs à la nouvelle url, et que la page cible traite les données POST ouvertes dans le utilisateur. Vous ne pouvez pas faire cela en manipulant le tableau $_POST (il semble être juste une copie PHP des données réelles). Peut-être que quelqu'un sait comment modifier le véritable jeu de données POST?
  6. à partir de 5, il n'y a aucune possibilité de recueillir des informations privées sur forme originale, et juste envoyer uniquement les informations de paiement sur le formulaire à PayPal ou qui que ce soit, via le navigateur de l'utilisateur pour leur approbation explicite de paiement. Cela signifie QU'AJAX est nécessaire pour le faire par en utilisant deux formulaires, l'un contenant les informations privées sans bouton, et l'autre forme avec le bouton D'Achat PayPal qui utilise AJAX pour soumettre l'autre forme, et, selon le résultat, soumettre sa propre forme. Vous pouvez utiliser les champs que PayPal n'utilise pas, mais ils sont toujours on a l'info, et on ne sait pas ce qu'ils ont le chalutage de plus de données du formulaire soumis.
  7. plutôt que D'utiliser AJAX comme en 6, il serait beaucoup plus simple d'avoir 3 versions du formulaire:
    1. initiale pour saisir les données privées.
    2. en cas de problème, présenter de nouveau le formulaire avec les données soumises et l'indication de données incorrectes ou problème d'arrière-plan.
    3. si OK, un formulaire PayPal, soumis automatiquement par javascript à le bas de la page (le formulaire.soumettre (), ou une demande de soumettre manuellement 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="paypal.email@yourdomain.com" />
   <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?>" />  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>
0
répondu Patanjali 2016-08-26 10:55:37

in a POST Redirect GET situation, (see https://en.wikipedia.org/wiki/Post/Redirect/Get) il est acceptable d'utiliser la variable 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');
}
0
répondu Joseph Pesco 2016-10-07 17:58:10

Vous pirater quelque chose comme les suivantes... (Je ne dis pas que vous devrait toutefois!):

$res = "<form action='/path/to/new/page' method='POST' id='redirectHack'>
            <input type='hidden' id='postVar1' name='postVar1' value='12345'>
            <input type='hidden' id='postVar2' name='postVar2' value='67890'>
        </form>
        <script>
            document.getElementById('redirectHack').submit()
        </script>";
die($res);
0
répondu cronoklee 2018-05-04 15:34:48