Comment faire une redirection en PHP?

est-il possible de rediriger un utilisateur vers une autre page en utilisant PHP?

dire que l'utilisateur va à www.example.com/page.php et je veux les rediriger vers www.example.com/index.php , comment le faire sans l'utilisation d'un meta refresh? Possible?

cela pourrait même protéger mes pages contre les utilisateurs non autorisés.

1021
demandé sur gturri 2009-04-20 18:13:22
la source

28 ответов

Résumé des questions / réponses en plus de ma propre deux cents:

1. Réponse de base

vous pouvez utiliser la fonction header() pour envoyer un nouvel en-tête HTTP, mais celui-ci doit être envoyé au navigateur avant tout HTML ou texte (donc avant la déclaration <!DOCTYPE ...> , par exemple).

header('Location: '.$newURL);

2. Détails importants

die() ou exit()

header("Location: http://example.com/myOtherPage.php");
die();

Pourquoi utiliser die() ou exit() : le quotidien WTF

URL absolue ou relative

depuis juin 2014 les URLs absolues et relatives peuvent être utilisées. Voir RFC 7231 qui avait remplacé l'ancienne RFC 2616 , où seules les URL absolues étaient autorisées.

Codes D'État

PHP "Location" - header utilise toujours le code de redirection HTTP 302 , mais ce n'est pas celui que vous devez utiliser. Vous devez considérer soit 301 (redirection permanente) ou 303 (autre).

Note: W3C mentionne que l'en-tête 303 est incompatible avec" de nombreux agents utilisateurs pré-HTTP/1.1. Les navigateurs actuellement utilisés sont tous Agents utilisateurs HTTP/1.1. Ce n'est pas vrai pour beaucoup d'autres agents utilisateurs comme les araignées et les robots.

3. Documentation

les en-têtes HTTP et la fonction header() en PHP

4. Alternatives

vous pouvez utiliser la méthode alternative de http_redirect($url); qui nécessite le paquet PECL pecl pour être installé.

5. Fonctions D'Aide

cette fonction n'intègre pas le code d'état 303:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

C'est plus flexible:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. Contournement

comme mentionné header() redirige seulement le travail avant que quelque chose ne soit écrit. Ils échouent généralement si invoqué INMIDST HTML sortie. Alors vous pouvez utiliser un contournement d'en-tête HTML (pas très professionnel!) comme:

 <meta http-equiv="refresh" content="0;url=finalpage.html">

ou une redirection JavaScript.

window.location.replace("http://example.com/");
1454
répondu markus 2018-08-13 15:34:24
la source
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

N'oubliez pas de mourir()/exit()!

93
répondu Alix Axel 2009-04-28 07:14:38
la source

produit JavaScript à partir de PHP en utilisant echo, qui fera le travail.

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

vous ne pouvez pas vraiment le faire en PHP à moins que vous amortissiez la sortie de page et vérifiez plus tard la condition de redirection. Qui pourrait être de trop de tracas. Rappelez-vous que les en-têtes sont la première chose qui est envoyé de la page. La plupart de la redirection est généralement nécessaire plus tard dans la page. Pour cela, vous devez amortir toute la sortie de la page et vérifier la condition de redirection plus tard. À l' point vous pouvez soit rediriger la page en-tête de l'utilisateur() ou simplement faire écho à la sortie tamponnée.

pour en savoir plus sur les tampons (avantages)

Qu'est-ce que le tampon de sortie?

88
répondu Hammad Khan 2017-05-23 14:47:36
la source

Utiliser header() fonction envoyer HTTP Location en-tête :

header('Location: '.$newURL);

contrairement à ce que certains pensent, die() n'a rien à voir avec la redirection. Utilisez seulement si vous voulez rediriger à la place de d'exécution normale.

exemple.php:

<?php 
header('Location: static.html');
$fh = fopen('/tmp/track.txt','a');
fwrite($fh, $_SERVER['REMOTE_ADDR'].' '.date('c')."\n");
fclose($fh);
?>

résultat ou 3 exécutions:

[email protected]:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

reprise-obligatoire die() / exit() est une légende urbaine, qui n'a rien à voir avec PHP réel. N'a rien à voir avec l'en-tête client "respecting" Location: . L'en-tête d'envoi n'arrête pas L'exécution de PHP, quel que soit le client utilisé.

83
répondu vartec 2009-04-21 11:52:52
la source

1. Utilisant la fonction d'en-tête avec exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

mais si vous utilisez la fonction d'en-tête puis quelques fois vous obtiendrez " avertissement comme en-tête déjà envoyer " pour résoudre qui ne font pas écho ou imprimer avant d'envoyer des en-têtes ou vous pouvez simplement utiliser die() ou exit() après la fonction d'en-tête.

2. Sans en-tête

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

ici, vous n'aurez aucun problème

3. Utilisant la fonction d'en-tête avec ob_start() et ob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>
58
répondu Juned Ansari 2018-03-20 13:08:37
la source

la plupart de ces réponses oublient une très étape importante!

header("Location: myOtherPage.php");
die();

quitter cette deuxième ligne vitale pourrait vous voir finir sur le WTF quotidien . Le problème est que les navigateurs ne ont pour respecter les en-têtes que votre page renvoie, donc avec les en-têtes étant ignorés, le reste de la page sera exécuté sans redirection.

50
répondu nickf 2009-04-20 18:33:34
la source
<?php header('Location: another-php-file.php'); exit(); ?>

ou si vous avez déjà ouvert des balises php, utilisez ceci:

header('Location: another-php-file.php'); exit();

vous pouvez également rediriger vers des pages externes, par exemple:

header('Location: https://www.google.com'); exit();

assurez-vous d'inclure exit() ou include die() 151960920"

23
répondu jake 2016-06-14 16:47:00
la source

beaucoup de ces réponses sont correctes, mais elles supposent que vous avez une URL absolue, ce qui n'est peut-être pas le cas. Si vous voulez utiliser un URL relative et générer le reste, alors vous pouvez faire quelque chose comme ceci...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302
18
répondu Luke 2014-01-15 08:21:54
la source

Vous pouvez utiliser des variables de session pour contrôler l'accès aux pages et autoriser les utilisateurs valides.

<?php

session_start();

if ( !isset( $_SESSION["valid_user"]) )
{
    header("location:../");
   die();
}

// Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php .

récemment, j'ai eu des cyber-attaques et j'ai décidé, j'avais besoin de connaître les utilisateurs qui essayaient D'accéder au panneau D'administration ou à une partie réservée de l'application web.

donc, j'ai ajouté un log accès IP et des sessions utilisateur dans un fichier texte parce que je Je ne veux pas déranger ma base de données.

17
répondu Asuquo12 2018-05-11 16:57:12
la source

j'ai déjà répondu à cette question, mais je le referai car dans l'intervalle j'ai appris qu'il y a des cas spéciaux si vous exécutez dans CLI (les redirections ne peuvent pas se produire et ne devraient donc pas exit() ) ou si votre serveur web exécute PHP comme un (F)CGI (il a besoin d'un en-tête défini précédemment Status pour rediriger correctement).

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // if using sessions
            {
                session_regenerate_id(true); // avoids session fixation attacks
                session_write_close(); // avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

j'ai aussi géré la question du support des différents codes de redirection HTTP ( 301 , 302 , 303 et 307 ), tel qu'il a été traité dans les commentaires de ma réponse précédente, voici les descriptions:

  • 301 - Déplacé De Façon Permanente
  • 302 - trouvé
  • 303 - Voir D'Autres
  • 307 - redirection temporaire (HTTP / 1.1)
13
répondu Alix Axel 2011-04-29 01:31:36
la source

header( 'Location: http://www.yoursite.com/new_page.html' );

12
répondu Daniel A. White 2009-04-20 18:14:41
la source
header("Location: /index.php");
exit(0);   
10
répondu joan16v 2015-01-12 14:03:32
la source

vous pouvez utiliser certaines méthodes de script java comme ci-dessous

 1)self.location="http://www.example.com/index.php";

 2)window.location.href="http://www.example.com/index.php";

 3)document.location.href = 'http://www.example.com/index.php';  

 4)window.location.replace("http://www.example.com/index.php");
8
répondu Vikram Pote 2015-03-12 12:42:18
la source
<?php 
header('Location: redirectpage.php');
header('Location: redirectpage.php');exit();
echo "<script>location.href='redirectpage.php';</script>";
?>

c'est une redirection régulière et normale de PHP mais vous pouvez faire une redirection d'une page avec quelques secondes d'attente ci-dessous code:

<?php
header('refresh:5;url=redirectpage.php '); //Note: here 5 means 5 seconds wait for redirect.
?>
7
répondu Obaidul Haque 2017-08-18 09:46:30
la source

Oui, vous pouvez utiliser header() , de

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();

et aussi la meilleure pratique est d'appeler exit () fonction immédiatement après header() fonction pour éviter l'exécution de code ci-dessous.

selon la documentation, header() doit être appelé avant toute sortie réelle est envoyé.

7
répondu CasperSL 2017-11-28 04:11:32
la source

comme d'autres l'ont dit ici, en envoyant l'en-tête de localisation avec:

header( "Location: http://www.mywebsite.com/otherpage.php" );

mais vous devez le faire avant d'avoir envoyé toute autre sortie au navigateur.

aussi, si vous allez utiliser ceci pour bloquer les utilisateurs non-authentifiés de certaines pages, comme vous l'avez mentionné, gardez à l'esprit que certains agents utilisateurs ignoreront ce et continueront sur la page actuelle de toute façon, donc vous aurez besoin de mourir() après l'avoir envoyé.

6
répondu Brent 2009-04-20 18:23:17
la source

à la veille de la toile sémantique, la justesse est quelque chose à considérer. Malheureusement, L'en-tête "Location"de PHP utilise toujours le code de redirection HTTP 302 , qui, à strictement parler, n'est pas le meilleur pour la redirection. Celui qu'il devrait utiliser à la place, est le 303 un.

W3C est assez aimable pour mention que l'en-tête 303 est incompatible avec " de nombreux pré-agents utilisateurs HTTP/1.1," ce qui équivaudrait à aucun navigateur en usage courant. Ainsi, le 302 est une relique, qui ne devrait pas .

...ou vous pouvez simplement l'ignorer, comme tout le monde...

6
répondu Henrik Paul 2009-04-21 00:25:12
la source

Probablement trop tard pour répondre à ça. Néanmoins, voici mes pensées:

IMHO, la meilleure façon de rediriger une demande entrante serait d'utiliser des en-têtes de localisation, qui va

<?php
header("Location: /index.php");
?>

une fois cette instruction exécutée, et la sortie envoyée, le navigateur commencera à réorienter l'utilisateur. Cependant, assurez-vous qu'il n'y a pas eu de sortie (aucun écho / var_dump) avant d'envoyer les en-têtes, sinon cela conduira à des erreurs.

bien qu'il s'agisse d'un moyen rapide et sale pour réaliser ce qui a été demandé à l'origine, mais il se révélerait éventuellement un désastre de SEO, car ce genre de re-direct est toujours interprété comme un re-direct 301 / 302, donc les moteurs de recherche verront toujours votre page d'index comme une page ré-dirigée, et pas quelque chose d'une page d'accueil / page principale. Par conséquent, il aura une incidence sur les paramètres de référencement du site web.

6
répondu Bhaskar Pramanik 2017-01-28 17:48:31
la source

la meilleure façon de rediriger avec PHP est le code suivant...

 header("Location: /index.php");

assurez-vous qu'aucun code ne fonctionnera après

header("Location: /index.php");

tous les codes doivent être exécutés avant la ligne ci-dessus.

Supposons,

Cas 1:

echo "I am a web developer";
header("Location: /index.php");

il redirigera correctement vers l'emplacement (index.php).

Cas 2:

return $something;
header("Location: /index.php");

le code ci-dessus ne redirigera pas vers l'emplacement(index.php).

si tout va bien, c'est clair.

5
répondu sabuz 2017-04-09 12:38:07
la source

pour rediriger le visiteur vers une autre page (particulièrement utile dans une boucle conditionnelle), utilisez simplement le code suivant:

<?php 
header('Location: mypage.php'); 
?>

Dans ce cas, mypage.php est l'adresse de la page vers laquelle vous souhaitez rediriger les visiteurs. Cette adresse peut être absolue et peut également inclure les paramètres dans ce format: mypage.php?param1=val1¶m2=val2)

Chemin Relatif / Absolu

lors de la négociation avec les chemins relatifs ou absolus, il est idéal de choisir un chemin absolu à partir de la racine du serveur (DOCUMENT_ROOT). Utiliser le format suivant:

<?php 
header('Location: /directory/mypage.php'); 
?>

si jamais la page cible est sur un autre serveur, vous incluez L'URL complète:

<?php 
header('Location: http://www.ccm.net/forum/'); 
?> 

en-Têtes HTTP

selon le protocole HTTP, les en-têtes HTTP doivent être envoyés before tout type de contenu. Cela signifie qu'aucun personnage n' devrait jamais être envoyés avant le tête de même pas un espace vide!

Redirections Temporaires / Permanentes

Par défaut, le type de redirection présenté ci-dessus est temporaire. Cela signifie que les moteurs de recherche, tels que Google, ne tiendra pas compte de la redirection lors de l'indexation.

Si vous souhaitez informer les moteurs de recherche qu'une page a été définitivement déplacé vers un autre emplacement, utilisez le code suivant:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: new_address'); 
?>

par exemple, cette page a le code suivant:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: /pc/imprimante.php3'); 
exit(); 
?>

Lorsque vous cliquez sur le lien ci-dessus, vous êtes automatiquement redirigé vers cette page. De plus, il s'agit d'une redirection permanente (statut: 301 déplacé de façon permanente). Donc, si vous tapez la première URL dans Google, vous serez automatiquement redirigé vers la deuxième, redirigé lien.

interprétation du code PHP

le code PHP situé après l'en-tête() sera interprété par le serveur, même si le visiteur se déplace à l'adresse spécifiée dans la redirection. Dans la plupart des cas, cela signifie que vous avez besoin d'une méthode pour suivre la fonction header() de la fonction exit() afin de diminuer la charge du serveur:

<? 
header('Status: 301 Moved Permanently', false, 301); 
header('Location: address'); 
exit(); 
?>
5
répondu Star 2018-02-13 12:26:52
la source

Oui il est possible D'utiliser PHP, Nous redirigerons vers une autre page, essayez celle-ci:

<?php
header("location:./");//redirect to index file
header("location:index.php");//redirect to index file
header("location:example.php");
?>
4
répondu Bhargav Chudasama 2017-06-08 12:48:28
la source

Nous pouvons le faire dans les deux sens

  1. quand l'utilisateur vient sur https://bskud.com/PINCODE/BIHAR/index.php puis rediriger vers https://bskud.com/PINCODE/BIHAR.php

par ci-dessous de code php

<?php header("Location: https://bskud.com/PINCODE/BIHAR.php"); exit; ?>

Enregistrer le code ci-dessus dans https://bskud.com/PINCODE/BIHAR/index.php

2.Quand tout condition true puis rediriger vers une autre page

<?php  $myVar = "bskud";   if ($myVar == "bskud") { ?>  <script> window.location.href="https://bskud.com";  </script> <?php  } else {  echo "<b>Check Website Name Again</b>"; } ?>

"

3
répondu Kavita Sharma 2018-01-04 12:57:51
la source

vous pouvez mettre à jour l'en-tête en php: en-tête

2
répondu Zack Marrapese 2009-04-20 23:47:17
la source

vous pouvez essayer d'utiliser la fonction d'en-tête php pour faire la redirection. Vous voulez configurer le tampon de sortie pour que votre navigateur ne lance pas d'avertissement de redirection à l'écran.

ob_start();
header("Location: ".$website);
ob_end_flush();
1
répondu Doruk Ayar 2016-11-15 22:51:24
la source

Si vous utilisez Apache, vous pouvez également utiliser .htaccess pour rediriger.

Redirect 301 / http://new-site.com/
1
répondu jabko87 2017-10-13 13:56:05
la source
<?php
$url = "targetpage"
Function redirect$url(){
   If (headers_sent()) == false{
      Echo '<script>window.location.href="' . $url . '";</script>';
}}
?>
1
répondu Joshua Charles Pickwell 2017-11-20 22:10:01
la source

il y a plusieurs façons de faire cela, mais si vous préférez php , je recommande l'utilisation de la fonction header() .

fondamentalement

$your_target_url = “www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

si vous voulez lui donner un coup de pouce, il est préférable de l'utiliser dans les fonctions, de cette façon, vous êtes en mesure d'ajouter des authentifications et d'autres éléments de vérification dans elle.

essayons en vérifiant le niveau de l'utilisateur.

Ainsi, supposons que vous ayez stocké le niveau d'autorité de l'utilisateur dans une session appelée u_auth .

dans le function.php

<?php

function authRedirect($get_auth_level, $required_level, $if_fail_link = “www.example.com/index.php”){
    if($get_auth_level != $required_level){
        header(location : $if_fail_link);
        return false;
        exit();
    }else{
        return true;
    }
 }

 . . . 

vous appellerez alors la fonction pour chaque page que vous voulez authentifier.

comme dans page.php ou toute autre page.

<?php

// page.php

require “function.php”

authRedirect($_SESSION[‘u_auth’], 5);  // redirects to www.example.com/index.php if the user isn’t auth level 5
authRedirect($_SESSION[‘u_auth’], 4);  // redirects to www.example.com/index.php if the user isn’t auth level 4
authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);  // redirects to www.someotherplace.com/somepage.php if the user isn’t auth level 2


. . . 

j'espère que vous trouverez le contenu utile

Références;

1
répondu Pyr James 2018-01-29 01:17:07
la source

1. Utilisation de l'en-tête In-build fonction php

a) redirection Simple Sans paramètres

<?php

   header('Location: index.php');

?>

b) rediriger avec les paramètres GET

<?php

      $id = 2;

      header("Location: index.php?id=$id&msg=succesfully redirect");

  ?>

2. Rediriger avec javascript en php

a) redirection Simple Sans paramètres

<?php 

     echo "<script>location.href='index.php';</script>";

 ?>

b) rediriger avec les paramètres GET

<?php 

     $id = 2;

     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";

   ?>
0
répondu Shaan Ansari 2018-08-03 16:26:57
la source

Autres questions sur php redirect