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

32
demandé sur superjos 2011-01-16 00:09:23

7 réponses

<?php
    header("Status: 301 Moved Permanently");
    header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
    exit;
?>
79
répondu regality 2012-08-22 14:45:03

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());
9
répondu jontro 2015-11-30 15:23:12

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:

  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 (+)

  • 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.

6
répondu jave.web 2014-06-25 10:03:08

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.

3
répondu eklundchristopher 2011-01-15 21:14:05

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

2
répondu Crayon Violent 2011-01-15 21:14:45

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

1
répondu Alec 2011-01-15 21:13:05

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

1
répondu dasrecht 2012-05-22 06:47:41