web-dev-qa-db-fra.com

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 façon compréhensible.

Existe-t-il une solution intelligente pour mettre en œuvre cela?

salutations

35
Graslandpinguin
<?php
    header("Status: 301 Moved Permanently");
    header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
    exit;
?>
85
regality

Pour effectuer la redirection et vous assurer qu'un point d'interrogation supplémentaire n'apparaît pas lorsque la chaîne de requête n'est pas transmise, utilisez ce qui suit

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());
10
jontro

Je voudrais ajouter une option de plus ...
Quoi qu'il en soit - comme d'autres l'ont dit, utiliser (. Htaccess) mod_rewrite serait probablement la meilleure option.

Cependant,
il peut sûrement y avoir de nombreuses situations où vous devez le faire en PHP => vous avez 2 options:

  1. Ajoutez votre URI de redirection avec $_SERVER['QUERY_STRING']
  2. Ajoutez votre URI de redirection avec une requête construite par vous-même: http_build_query($_GET);

Option 2. - Avantages (+)

  • Encode les paramètres (par défaut PHP_QUERY_RFC1738)
  • vous pouvez facilement ajouter (ou supprimer) certains paramètres $_GET comme:
    $_GET['new_param']="new value"; (Ajouter)
    unset($_GET['param_to_remove']); (supprimer)
  • si l'environnement (Dieu sait pourquoi) ne fournit pas QUERY_STRING - vous pouvez probablement encore obtenir le superglobal $_GET => indépendant de l'environnement
  • Le premier 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 changer le séparateur d'arguments si nécessaire

Option 2. - Inconvénients (-)

  • ce type de requête de construction peut être redondant ("bon à rien"), tout simplement inutile ...
  • si la requête est grande (peut-être une attaque?), cela pourrait avoir un impact sur la performance, car à chaque fois 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 - a PHP site du manuel sur le http_build_query() fonction qui Returns a URL-encoded string.

7
jave.web

En utilisant $_SERVER['QUERY_STRING'] et l'ajouter à la fin de votre redirection pourrait être ce que vous recherchez.

EDIT: Je viens de remarquer que j'étais un peu en retard avec ma réponse.

3
eklundchristopher

Tout d'abord, pourquoi ne pas rediriger avec la réécriture du mod?

Mais de toute façon, vous pouvez concaténer $ _SERVER ['QUERY_STRING'] à la fin de votre URL

2
Crayon Violent

Je suggère également d'utiliser mod_rewrite pour cette tâche, vous pouvez être plus flexible.

1
dasrecht

Ajoutez le $_SERVER['REQUEST_URI'] Ou le QUERY_STRING. Faites une print_r($_SERVER); pour voir plus d'informations sur l'URL demandée.

1
Alec