wake-up-neo.net

PHP Umleitung mit Post-Parametern

Ich habe eine Webseite. Diese Webseite leitet den Benutzer zu einer anderen Webseite auf die folgende Weise um:

<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>

Nun, Sie sehen, was ich tue, ist die Übertragung der GET-Parameter in POST-Parameter. Sag mir nicht, dass es schlecht ist, ich weiß es selbst und es ist nicht genau das, was ich wirklich mache. Wichtig ist, dass ich Daten aus einem Array sammle und versuche, sie per POST an eine andere Seite zu senden. Wenn der Benutzer JavaScript deaktiviert hat, funktioniert es nicht. Was ich wissen muss: Gibt es eine Möglichkeit, POST -Parameter mithilfe von PHP zu übertragen, sodass die Umleitung auch auf PHP-Weg (header('Location: anotherpage.php');) erfolgen kann ?

Es ist sehr wichtig für mich, die Params per POST zu übergeben. Ich kann die $ _SESSION-Variable nicht verwenden, da sich die Webseite in einer anderen Domäne befindet. Daher unterscheiden sich die $ _SESSION-Variablen.

Jedenfalls brauche ich einfach einen Weg, um POST Variablen mit PHP ^^ zu übertragen

Danke im Voraus!

21
arik

Keine Möglichkeit, dies direkt vom Server aus durchzuführen, da POST -Daten vom Browser gesendet werden sollen. 

Sie können aber eine Alternative wählen:

  • Das vorgefüllte Formular, das automatisch in Ihrem Beispiel übermittelt wurde, könnte funktionieren, aber wie Sie geschrieben haben, ist es keine wirklich gute Praxis und kann Benutzer auf einer leeren Seite belassen
  • Erhalten Sie GET-Argumente und POST mit curl (oder einem anständigen http-Client) zur zweiten Site, und übertragen Sie das Ergebnis an den Browser. Dies wird als Proxy bezeichnet und kann imho eine gute Lösung sein.
  • Treffen Sie die gemeinsame Nutzung der Sitzung über eine Domäne hinweg, kann dies nicht bei allen Setups möglich sein und kann komplex sein. Sobald die Einrichtung abgeschlossen ist, ist die gemeinsame Nutzung der Sitzung für PHP-Code fast transparent. Wenn Sie mehr als ein Kommunikationsbedürfnis zwischen den beiden Domänen haben, kann es sich lohnen, dies zu tun.

Beispiel mit curl-Lösung, Code zur Ausführung in Domäne 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;

Das ist es, der Browser Ihres Clients kann nicht einmal Server der Domäne 2 sehen, er erhält nur Ergebnisse. Wenn Sie wissen, ob Sie den Client zur Domäne umleiten möchten, tun Sie dies mit dem klassischen http-Header.

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

Dies ist natürlich Demo-Code mit fest codierten Werten, und es sind noch 2 Punkte übrig: 

  • Sicherheit: Die Abfragezeichenfolge sollte gefiltert oder erneut erstellt werden, um nur die erforderlichen Parameter zu übertragen, und Sie sollten den Server in Domäne 2 mit einem 200-HTTP-Code bestätigen.
  • Die Anwendungslogik sollte an diesem Teil wenig Anpassungen erfordern: Wenn die Domain-2-App erwartet, dass Post-Daten in derselben Anfrage abgelegt werden, während der Besucher kommt, wird dies nicht ausgeführt. Aus Sicht der Domäne 2 ist der Client, der die Anforderung POST ausführt, der Server, der die Domäne 1 und nicht der Client-Browser hostet. Dies ist wichtig, wenn die IP-Adresse des Clients oder andere Clientprüfungen in Domäne 2 durchgeführt werden. Wenn die Anforderung POST dazu dient, clientspezifische Inhalte anzuzeigen, müssen Sie auch serverseitige Nachverfolgung durchführen, um zuvor veröffentlichte Daten mit dem umgeleiteten Besucher zu kombinieren.

Hoffe es ist jetzt klarer und wird dir helfen

12
Benoit

Sie können eine POST -Anforderung umleiten und die Informationen zum POST hinzufügen. Sie müssen jedoch explizit den HTTP-Statuscode 307 zurückgeben. Browser behandeln 302 als Weiterleitung mit für GET, wobei die ursprüngliche Methode ignoriert wird. Dies ist in der HTTP-Dokumentation explizit vermerkt:

In der Praxis bedeutet dies in PHP, dass Sie den Statuscode vor dem Weiterleitungsspeicherort setzen müssen:

    header('HTTP/1.1 307 Temporary Redirect');
    header('Location: anotherpage.php');

Beachten Sie jedoch, dass der Benutzeragent MUSS den Benutzer gemäß der HTTP-Spezifikation MÜSSEN anfragen, ob er die POST -Informationen erneut an die neue URL übermitteln kann. Praktisch fragt Chrome nicht und Safari auch nicht, aber Firefox zeigt dem Benutzer ein Popup-Fenster an, in dem die Umleitung bestätigt wird. Abhängig von Ihren betrieblichen Einschränkungen ist dies möglicherweise in Ordnung, obwohl dies im allgemeinen Anwendungsfall durchaus zu Verwirrung bei Endbenutzern führen kann.

16
Charles

Dies kann mit php cUrl lib durchgeführt werden.

Überprüfen Sie diese http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html

Danke, Sourabh

1
Sourabh

Es ist möglich. In dieser Situation würde ich cURL verwenden:

$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
DBruns

In einer POST Redirect GET-Situation (siehe https://en.wikipedia.org/wiki/Post/Redirect/Get ) ist es zulässig, die Sitzungsvariable als Transportmethode zu verwenden die Daten.

<?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
Joseph Pesco

Nein. Sie können mit POST keine Header-Umleitung durchführen. Sie haben 2 Möglichkeiten,

  1. Sie können stattdessen GET verwenden, wenn das Ziel entweder POST oder GET akzeptiert.
  2. In seltenen Fällen fügen wir einen Button hinzu, wenn das Javascript deaktiviert ist.

Hier ist ein Beispiel,

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

Wenn Javascript deaktiviert ist, wird eine Schaltfläche zum Fortfahren angezeigt, sodass der Benutzer zum Fortfahren auf klicken kann.

0
ZZ Coder

Sie könnten hacken so etwas wie das Folgende ... (Ich sage nicht, dass Sie sollten jedoch!):

$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
cronoklee

Speichern Sie Ihre Daten in einer Sitzung und verwenden Sie dann GET.

0
ThiefMaster

Als Beispiel für das, was @Charles angibt, gibt es hier ein funktionierendes PHP-Paypal-Kaufformular, das:

  1. Überprüft die Eingabe mit Javascript. Wenn es OK ist, wird es übermittelt, ansonsten wird eine Warnung angezeigt.
  2. Überprüft die Eingabe mit PHP. Wenn dies der Fall ist, werden die Umleitungsheader erstellt und der Text-HTML-Code entfernt. Andernfalls wird dasselbe Formular erneut angezeigt.

Beachten Sie, dass:

  1. Die Eingaben sollten auf dem Server erneut überprüft werden, da die Eingaben eines Browsers auf unzulässige Weise manipuliert werden können.
  2. Vor den Header-Befehlen kann kein HTML-Code ausgegeben werden, da sie mit einer PHP-Warnung ignoriert werden.
  3. Javascript kann nur die Eingaben auf gültige Werte überprüfen, aber ohne AJAX kann der Server vor dem Senden nicht auf das überprüft werden, was der Benutzer wünscht. Daher ist diese Methode der vollständige Nicht-Javascript-Prozess.
  4. Es wird kein HTML-Code benötigt, wenn das Weiterleitungsziel (wie Paypal) nur die POST -Daten verarbeitet. Ziele für Menschen natürlich!
  5. Unglücklicherweise bedeutet 4, dass Sie nicht nur eine Teilmenge oder gar einen vollständigen anderen Satz von Werten an die neue URL senden können UND die Zielseite die POST -Daten im Browser des Browsers user öffnen soll . Sie können dies nicht tun, indem Sie das $ _POST-Array bearbeiten (es scheint nur eine Kopie von PHP der tatsächlichen Daten) zu sein. Vielleicht weiß jemand, wie man den realen POST Datensatz verändert?
  6. Ab 5 gibt es keine Möglichkeit, private Informationen über das Originalformular Zu erhalten, und Sie müssen lediglich die Zahlungsinformationen auf dem Formular An Paypal oder an wen auch immer über den Browser des Benutzers senden, um deren ausdrückliche Zahlungsgenehmigung zu erhalten . Das bedeutet, dass AJAX erforderlich ist, um Mit zwei Formularen auszuführen, wobei eines die privaten Informationen ohne Schaltfläche und das andere Formular mit dem Paypal-Kauf-Button enthält, der _ verwendet.AJAX, um Das andere Formular zu übermitteln, und abhängig vom Ergebnis das eigene Formular. Sie können Felder verwenden, die Paypal nicht verwendet, sie sind jedoch immer noch die Informationen erhalten, und wir wissen nicht, was sie übergebene Formulardaten durchlaufen haben.
  7. Anstatt AJAX wie in 6 zu verwenden, wäre es viel einfacher, 3 Versionen der Form zu haben:
    1. Initial, um die privaten Daten zu erfassen.
    2. Wenn das Problem auftritt, zeigen Sie das Formular mit den übermittelten Daten erneut an und weisen Sie auf falsche Daten oder ein Back-End-Problem hin.
    3. Wenn dies OK ist, ein Paypal-Formular, das automatisch von Javascript an Am unteren Rand der Seite (form.submit ()) übermittelt wird, oder die Anforderung, das Senden per Button manuell zu starten, wenn kein Javascript vorhanden ist.

<?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>

0
Patanjali