Voici un piège sur lequel vous risquez de tomber si vous comptez passer un URL comme valeur dans la query string (peu importe le langage de programmation utilisé, ça ne s'applique pas exclusivement au PHP). Considérant un URL comme le suivant :
http://tests.localhost/script.php?active=1&redirect=http://www.google.com/page.php?q=test&limit=10
Vous remarquerez que parmi les paramètres passés dans la query string, il existe plusieurs clés dont "active" et "redirect". On note aussi que la valeur de la clé redirect est elle-même un URL. Donc l'URL complet compte deux "?" en plus des clés supplémentaires "q" et "limit". On pourrait s'attendre à ce que la valeur de la clé redirect soit "http://www.google.com/page.php?q=test&limit=10". Pourtant non.
echo $_GET['redirect']; // http://www.google.com/page.php?q=testAussi, la dernière combinaison de clé/valeur est manquante. Pourquoi ? Simplement parce que c'est une clé additionnelle qui est considérée comme partie intégrante de l'URL principal (pas de la valeur du paramètre redirect) et qui est séparée du reste avec le symbole "&". La paire q=test est complètement ignorée parce qu'elle fait partie de la deuxième combinaison :
?(active=1)&(redirect=http://www.google.com/page.php?q=test)&(limit=10)
echo $_GET['active']; // 1Même la fonction parse_url() n'est pas d'un grand secours pour le décortiquer :
echo $_GET['redirect']; // http://www.google.com/page.php?q=test
echo $_GET['limit']; // 10
$url = 'http://tests.localhost/script.php?active=1&redirect=http://www.google.com/page.php?q=test&limit=10';
$urlParts = parse_url($url);
print_r($urlParts);
ArrayPour contourner ce genre de problème, on devra préalablement transformer la valeur du paramètre redirect avec une fonction comme urlencode(). Le fichier script.php pourra ensuite extraire la valeur de la clé redirect en effectuant quelques manipulations et en décodant la valeur avant de faire la redirection.
(
[scheme] => http
[host] => tests.localhost
[path] => /script.php
[query] => active=1&redirect=http://www.google.com/page.php?q=test&limit=10
)
$urlParam = urlencode('http://www.google.com/page.php?q=test&limit=10');Certaines personnes pourraient avoir tendance à vouloir utiliser base64_encode() et base64_decode() pour encoder la valeur de l'URL passée en paramètre. Je ne vous recommande pas car vous risquez d'avoir un problème au moment de faire le split sur le caractère "=" (une chaîne encodée en base64 peut comprendre le caractère = dans le résultat).
$url = 'http://tests.localhost/script.php?active=1&redirect=' . $urlParam;
$parts = parse_url($url);
$pairs = explode('&', $parts['query']);
$keys = array();
foreach($pairs as $pair){
list($key, $value) = explode('=', $pair);
$keys[$key] = $value;
}
header('Location: ' . urldecode($keys['redirect']) );
exit;