redirection php avec des variables de chaîne de requête HTTP
Atm j'utilise les quatre lignes suivantes pour rediriger l'utilisateur vers une autre page de mon site web:
<?php
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html");
exit;
?>
Mais il y a un problème avec l'utilisation de variables de chaîne de requête HTTP comme http://< url >?param=blah
ils ne sont pas ajoutés à l'url de manière compréhensible.
Y a-t-il une initiative intelligente pour mettre en œuvre cela?
Salutations
7 réponses
<?php
header("Status: 301 Moved Permanently");
header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
exit;
?>
Pour faire la redirection et s'assurer qu'un point d'interrogation supplémentaire n'apparaît pas lorsque la chaîne de requête n'est pas passée, utilisez
function preserve_qs() {
if (empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], "?") === false) {
return "";
}
return "?" . $_SERVER['QUERY_STRING'];
}
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html" . preserve_qs());
Je voudrais ajouter une autre option...
de toute façon-comme d'autres l'ont dit, en utilisant (.htaccess) mod_rewrite serait probablement la meilleure option.
Cependant,
Il peut sûrement y avoir beaucoup de situations où vous devez le faire en PHP = > vous avez 2 options:
- ajoutez votre URI de redirection avec
$_SERVER['QUERY_STRING']
- ajoutez votre URI de redirection avec une requête construite par vous-même :
http_build_query($_GET);
Option 2. - Avantages (+)
- Code les paramètres ( par défaut PHP_QUERY_RFC1738)
- , vous pouvez facilement ajouter (ou supprimer) des
$_GET
params comme:$_GET['new_param']="new value";
(ajouter)unset($_GET['param_to_remove']);
(enlever) - si l'environnement (Dieu sait pourquoi) ne fournit pas de QUERY_STRING - vous êtes probablement toujours en mesure d'obtenir le superglobal
$_GET
= > indépendant de l'environnement -
Le 1er paramètre de
http_build_query()
peut en fait être n'importe quel tableau ou objet afin que vous puissiez construire une requête de type$_GET
à partir de$_POST
ou$o = new YourObject();
, si nécessaire, - vous pouvez modifier le séparateur d'arguments si nécessaire
Option 2. - Dissavantages (-)
- ce type de requête de construction peut être redondant ("bon à rien"), juste inutile...
- si la requête est grande enaugh(peut-être une attaque?) cela pourrait avoir un effet sur performace, car chaque fois qu'il y aura un tableau converti en chaîne et encodé
Pour plus d'informations, voir http://www.php.net/manual/en/function.http-build-query.php - le site D'un manuel PHP sur la fonction http_build_query()
Qui Returns a URL-encoded string.
Utiliser $_SERVER['QUERY_STRING']
et l'ajouter à la fin de votre redirection pourrait être ce que vous cherchez.
EDIT: je viens de remarquer que j'étais un peu en retard avec ma réponse.
Tout d'abord, pourquoi ne pas rediriger avec mod rewrite?
Mais de toute façon, vous pouvez concatter $_SERVER ['QUERY_STRING'] à la fin de votre url
Ajouter le $_SERVER['REQUEST_URI']
ou QUERY_STRING
. Faites un print_r($_SERVER);
pour voir plus d'informations sur l'URL demandée.
Je vous suggère aussi d'utiliser mod_rewrite pour cette tâche, vous pouvez être plus flexible.