Markus: POST + Location-Switch (Header/Curl)

Hallo zusammen,

gleich zum Problem - Ich möchte in einem Skript einen POST Request an einen externen Host senden. Dabei sollte entsprechend das Skript bzw. der Browser auch zur im POST angegebenen URL wechseln (wie bei einem GET Request - header("Location: http://www.example.com/");).

Das Problem habe ich bisher versucht mit den Funktionen header() oder den curl-Funktionen zu lösen. Beide Versuche liefern jedoch nicht das gewünschte Ergebnis.

Beim ersten Versuch mittels header() werden die Daten ($request) nicht gesendet, beim zweiten Versuch mittels curl-Funktionen wird der Location-Switch nicht ausgeführt.

Hat jemand einen Rat für mich?

Vorab Vielen Dank für Eure Unterstützung!

Beste Grüße,
Markus

/*
 * Versuch 1: POST mittels header()
 */

$request = "&var1=123&var2=456&var3=789";

$headers[] = "POST /script.php HTTP/1.1\r\n";
$headers[] = "Host: http://www.example.com\r\n";
$headers[] = "Content-Type: application/x-www-form-urlencoded\r\n";
$headers[] = "Content-Length: " . strlen($request) . "\r\n";
$headers[] = $request . "\r\n\r\n";

foreach($headers as $header) {
  header($header);
}

/*
 * Versuch 2: POST mittels curl
 */

$request['var1'] = '123';
$request['var2'] = '456';
$request['var3'] = '789';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/script.php');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Location: http://www.example.com/script.php'));
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_exec($ch);
curl_close($ch);

  1. hi,

    Ich möchte in einem Skript einen POST Request an einen externen Host senden. Dabei sollte entsprechend das Skript bzw. der Browser auch zur im POST angegebenen URL wechseln (wie bei einem GET Request - header("Location: http://www.example.com/");).

    Das kann so nichts werden.

    Dein Client fordert ein Script von deinem Server an. Egal, was dieses dann macht - der Client wartet auf eine Antwort von _deinem_ Server, denn der ist es, den er nach was gefragt hat.

    Wenn die Antwort des anderen Servers zum Client gelangen soll - dann muss dein Script sie dorthin weitergeben.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      da habe ich mich wohl mißverständlich ausgedrückt.

      Das Skript auf meiner Seite soll Daten via POST Request an ein anderes Skript weiterleiten. Nebst dem Senden der Daten möchte ich jedoch auch erzielen, daß die Adresse in der Location des Clients/Browsers entsprechend auf die Zieladresse geändert wird.

      Das Senden der Daten an die Zieladresse erfüllt meine in >>Versuch 2<< vorgestellte Lösung auch. Nur funktioniert eben die Änderung der Adresse in der Location des Clients/Browsers nicht.

      Beispiel

      Das Skript, welches die Daten sendet liegt unter >> http://www.example.com/send-data-script.php <<

      Die Zieladresse des POST Requests ist >> http://www.example.com/receive-data-script.php <<

      In dem Fall sendete das erste Skript erfolgrich die Daten an das zweite Skript, welches diese auch bearbeitet. Auch wird die Ausgabe des zweiten Skripts ist korrekt. Nur bleibt in diesem Fall in der Adresszeile des Clients/Browsers die Adresse des ersten Skripts stehen. Und das soll eben nicht so sein.

      Konkret handelt es sich dabei um die Einbindung mehrerer Payment-Systeme. Der Benutzer soll ein Payment-System auswählen können. Durch einen Klick auf den Namen eines Payment-Systems wird der Benutzer via GET Request auf ein Skript weitergeleitet, welches sensible Daten, wie z.B. die Zugangskennung, in einem POST Request zusammenfasst und diese dann an das ausgewählte Payment-System weiterleitet. Dies funktioniert soweit auch. Nur ist in diesem Fall dann eben die "Bezahlen-Seite" von z.B. Paypal zu sehen, in der Adresszeile des Browsers/Clients steht jeoch immer noch die URL des Skripts, das die Daten verabeitet und den POST Request durchgeführt hat.

      Dennoch vielen Dank für Deine Unterstützung!

      Beste Grüße,
      Markus

      1. hi,

        Das Senden der Daten an die Zieladresse erfüllt meine in >>Versuch 2<< vorgestellte Lösung auch. Nur funktioniert eben die Änderung der Adresse in der Location des Clients/Browsers nicht.

        Natürlich nicht.
        Du gibst cURL einen Header - denn dieses im Request an das zweite Script schickt. Was soll dieses im Request mit einem Response Header - ein solcher ist Location natürlich - anfangen?

        Darum ist der erste Versuch genauso unsinnig - header() löst Response Header aus - POST ist aber niemals Response, sondern immer Request.

        Nur ist in diesem Fall dann eben die "Bezahlen-Seite" von z.B. Paypal zu sehen, in der Adresszeile des Browsers/Clients steht jeoch immer noch die URL des Skripts, das die Daten verabeitet und den POST Request durchgeführt hat.

        Wenn du den Client per Location-Header zu Paypal schickst - dann stellt der Client einen eigenen Request an Paypal, der mit deinem vorherigen, per Script abgesetzten POST-Request überhaupt nichts zu tun hat.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }