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, voyez-vous, ce que je fais est de transférer les paramètres 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, mais il est important que je collecte les données d'un tableau et que j'essaie de les soumettre à une autre page via POST. Mais si l'utilisateur a désactivé JavaScript, cela ne fonctionnera pas. Ce que je dois savoir: Y a-t-il un moyen de transférer les paramètres POST au moyen de PHP pour que la redirection puisse également s'effectuer de la manière PHP (header('Location: anotherpage.php');
)?
Il est très important pour moi de passer les paramètres via POST. Je ne peux pas utiliser la variable $ _SESSION car la page Web se trouve sur un autre domaine. Les variables $ _SESSION sont donc différentes.
Quoi qu'il en soit, j'ai simplement besoin d'un moyen de transférer POST des variables avec PHP ^^
Merci d'avance!
Aucune possibilité de le faire directement à partir du serveur, car POST les données doivent être envoyées par le navigateur.
Mais vous pouvez choisir une alternative:
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;
Ça y est, le navigateur de votre client ne verra même pas le serveur de domaine 2, il obtiendra uniquement le résultat. Si vous voulez rediriger le client vers le domaine, faites-le avec un en-tête http classique.
header('Location: http://www.domain2.com');
Bien sûr, il s’agit d’un code de démonstration avec des valeurs codées en dur, et il vous reste 2 points:
J'espère que c'est plus clair maintenant et que cela vous aidera
Vous pouvez en-tête CAN rediriger une demande POST et inclure les informations POST. Toutefois, vous devez explicitement renvoyer 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 noté explicitement dans la documentation HTTP:
En pratique, cela signifie que dans PHP vous devez définir le code de statut avant l'emplacement de redirection:
header('HTTP/1.1 307 Temporary Redirect');
header('Location: anotherpage.php');
Cependant, notez que, conformément à la spécification HTTP, l'agent utilisateur DOIT demander à l'utilisateur s'il est en mesure de soumettre à nouveau les informations POST à la nouvelle URL. Concrètement, Chrome ne pose pas de question, pas plus que Safari, mais Firefox présentera à l'utilisateur une boîte de dialogue contextuelle confirmant la redirection. En fonction de vos contraintes d’exploitation, c’est peut-être correct, bien que dans un cas d’utilisation général, il risque de créer de la confusion chez 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);
Dans une POST redirection d'une situation GET, (voir https://en.wikipedia.org/wiki/Post/Redirect/Get ), il est acceptable d'utiliser la variable de session comme méthode de transport les 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');
}
Non, vous ne pouvez pas faire de redirection d'en-tête avec POST. Vous avez 2 options,
Voici un exemple,
<noscript>
<div>
<input type="submit" value="Continue"/>
</div>
</noscript>
Ceci affichera un bouton Continuer si Javascript est désactivé afin que l'utilisateur puisse cliquer pour continuer.
Vouspourriezpirater quelque chose comme ceci ... (je ne vous dis pasdevraitcependant!)
$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);
Stockez vos données dans une session, puis utilisez GET.
À titre d'exemple de ce que @Charles indique, voici un formulaire d'achat Paypal en PHP qui fonctionne:
Notez que:
<?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>