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!
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:
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:
Hoffe es ist jetzt klarer und wird dir helfen
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.
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
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);
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');
}
Nein. Sie können mit POST keine Header-Umleitung durchführen. Sie haben 2 Möglichkeiten,
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.
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);
Speichern Sie Ihre Daten in einer Sitzung und verwenden Sie dann GET.
Als Beispiel für das, was @Charles angibt, gibt es hier ein funktionierendes PHP-Paypal-Kaufformular, das:
Beachten Sie, dass:
<?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>