web-dev-qa-db-fra.com

Comment faire une redirection en PHP?

Est-il possible de rediriger un utilisateur vers une page différente en utilisant PHP?

Supposons que l'utilisateur accède à www.example.com/page.php et que je veuille les rediriger vers www.example.com/index.php, comment puis-je le faire sans utiliser une méta-actualisation? C'est possible?

Cela pourrait même protéger mes pages des utilisateurs non autorisés.

1172
Sam

Résumé des réponses existantes plus mes deux centimes:

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 texte 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 devriez-vous utiliser die() ou exit(): Le WTF quotidien

URL absolue ou relative

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

Codes d'état

Le code "Emplacement" de PHP utilise toujours le code de redirection HTTP 302 -, mais ce n'est pas celui-ci que vous devriez utiliser. Vous devriez envisager soit 1 (redirection permanente), soit (autre).

Remarque: Le W3C mentionne que l'en-tête 303 est incompatible avec "de nombreux agents utilisateurs antérieurs à HTTP/1.1. Les navigateurs actuellement utilisés sont tous des agents d'utilisateur HTTP/1.1. Ce n'est pas le cas de nombreux autres agents d'utilisateur comme araignées et robots.

3. Documentation

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

4. Alternatives

Vous pouvez utiliser la méthode alternative http_redirect($url); qui nécessite l'installation de paquet pecl .

5. Fonctions d'assistance

Cette fonction n'incorpore 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é précédemment, les redirections header() fonctionnent uniquement avant l'écriture de quoi que ce soit. Ils échouent généralement si invoqué au milieu HTML sortie. Ensuite, vous pouvez utiliser une solution de contournement en-tête HTML (pas très professionnelle!) Comme:

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

Ou une redirection JavaScript même.

window.location.replace("http://example.com/");
1606
markus

Utilisez la fonction header()) pour envoyer un en-tête HTTP Location :

header('Location: '.$newURL);

Contrairement à ce que certains pensent, die() n'a rien à voir avec la redirection. Utilisez-le uniquement si vous souhaitez rediriger à la place d'une exécution normale.

Fichier example.php :

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

Résultat de trois exécutions:

bart@hal9k:~> 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 le PHP actuel. Cela n'a rien à voir avec le client "respectant" l'en-tête Location:. L'envoi d'un en-tête n'arrête pas l'exécution PHP, quel que soit le client utilisé.

108
vartec
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 ()!

104
Alix Axel

Générer du code JavaScript à partir de PHP à l'aide de echo, qui fera l'affaire.

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

Vous ne pouvez pas vraiment le faire dans PHP à moins de mettre en tampon la sortie de la page, puis de vérifier ultérieurement la condition de redirection. C'est peut-être trop embêtant. Rappelez-vous que les en-têtes sont la première chose envoyée à partir de la page. La plupart des redirections sont généralement requises plus tard dans la page. Pour cela, vous devez mettre en tampon toute la sortie de la page et vérifier la condition de redirection ultérieurement. À ce stade, vous pouvez soit rediriger l’en-tête de l’utilisateur de la page (), soit simplement faire écho à la sortie mise en mémoire tampon.

Pour plus d'informations sur la mise en mémoire tampon (avantages)

Qu'est-ce que la mise en mémoire tampon de sortie?

95
Hammad Khan

1. Utilisation de 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, vous aurez parfois "un avertissement comme l'en-tête envoie déjà" pour résoudre ce problème sans écho ni impression avant l'envoi 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 ne rencontrerez aucun problème

. Utilisation de 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
?>
81
Juned Ansari

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

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

Si vous quittez cette seconde ligne vitale, vous risquez de vous retrouver sur The Daily WTF . Le problème est que les navigateurs n'ont pas pour respecter les en-têtes renvoyés par votre page. Par conséquent, les en-têtes étant ignorés, le reste de la page sera exécuté sans redirection.

53
nickf

Utilisation:

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

Ou si vous avez déjà ouvert les 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().

23
jake

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

<?php
    session_start();

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

    // 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é de connaître les utilisateurs qui tentaient d'accéder au panneau d'administration ou à la partie réservée de l'application Web.

J'ai donc ajouté un accès au journal pour l'adresse IP et les sessions utilisateur dans un fichier texte, car je ne veux pas déranger ma base de données.

19
Asuquo12

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

$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
Luke

J'ai déjà répondu à cette question, mais je le referai car, entre-temps, j'ai appris qu'il y avait des cas particuliers si vous exécutiez en CLI (les redirections ne peuvent pas se produire et ne devraient donc pas exit()) ou si votre serveur Web exécute PHP en tant que CGI (il a besoin d'un en-tête précédemment défini Status pour être correctement redirigé).

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 également traité la question de la prise en charge des différents codes de redirection HTTP (301, 302, 303 et 307), comme cela a été abordé dans les commentaires de mes précédentes. répondre. Voici les descriptions:

  • 1 - Déplacé en permanence
  • 2 - trouvé
  • - Voir autre
  • 7 - Redirection temporaire (HTTP/1.1)
13
Alix Axel

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

13
Daniel A. White
header("Location: /index.php");
exit(0);   
10
joan16v

Il y a deux façons de rediriger

tilisation de PHP

<?php 

header("Location: http://example.com/page.php");
die();
?>

en utilisant Jquery

<script>

     $(document).ready(function(){
    location.href = 'http://example.com/page.php';
     });

</script>
9
Javed Khan

vous pouvez utiliser ce code rediriger d'une page à une autre

header("Location: index.php");

ou si vous essayez de rediriger en utilisant JavaScript dans php puis utilisez balise script pour rediriger

echo "<script>window.open('your path where you redirect ','_self')</script>";
8
Kashif

Utilisation:

<?php
    header('Location: redirectpage.php');
    header('Location: redirectpage.php');
    exit();
    echo "<script>location.href='redirectpage.php';</script>";
?>

Ceci est une redirection PHP normale et normale, mais vous pouvez créer une page de redirection avec quelques secondes d'attente à l'aide du code ci-dessous:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>
8
Obaidul Haque

Vous pouvez utiliser certaines méthodes JavaScript 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
Vikram Pote

Oui, vous pouvez utiliser la fonction header () ,

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

La meilleure pratique consiste également à appeler la fonction exit () juste après la fonction header() pour éviter l'exécution du code ci-dessous.

Selon la documentation, header() doit être appelé avant l'envoi de toute sortie réelle.

7
Casper

Voici mes pensées:

IMHO, le meilleur moyen de rediriger une demande entrante serait d'utiliser des en-têtes de localisation, ce qui va

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

Une fois cette instruction exécutée et la sortie envoyée, le navigateur commence à rediriger l’utilisateur. Cependant, assurez-vous qu'il n'y a pas eu de sortie (aucun echo/var_dump) avant d'envoyer les en-têtes, sinon cela entraînerait des erreurs.

Bien qu’il s’agisse d’un moyen simple et rapide de réaliser ce qui avait été demandé à l’origine, il pourrait s’agir d’un désastre lié au référencement, car ce type de redirection est toujours interprété comme une redirection 301/302; les moteurs de recherche verront donc toujours votre page d'index en tant que page redirigée et non pas comme une page de destination/page principale.

Par conséquent, cela affectera les paramètres de référencement du site Web.

6
Bhaskar Pramanik

À la veille du Web sémantique, la correction est un élément à prendre en compte. Malheureusement, l'en-tête "Emplacement" de PHP utilise toujours le code de redirection HTTP 302 , qui, à proprement parler, n'est pas le meilleur pour la redirection. Celle qu’elle devrait utiliser à la place est celle .

Le W3C est assez gentil avec mentionnez que l'en-tête 303 est incompatible avec "de nombreux agents utilisateurs antérieurs à HTTP/1.1", ce qui équivaudrait à ne pas utiliser de navigateur actuellement. Donc, le 302 est une relique qui ne devrait pas être utilisée.

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

6
Henrik Paul

Comme d’autres ici dit, envoyer l’en-tête location avec:

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

mais vous devez le faire avant d'envoyer toute autre sortie au navigateur.

En outre, si vous souhaitez utiliser cette option pour bloquer les utilisateurs non authentifiés de certaines pages, gardez à l’esprit que certains agents d’utilisateur l'ignoreront et continueront de toute façon sur la page actuelle. vous devrez mourir () après l'avoir envoyé.

6
Brent

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 de ce format: mypage.php?param1=val1&m2=val2)

chemin relatif/absol

Lorsque vous traitez avec des chemins relatifs ou absolus, il est idéal de choisir un chemin absolu à partir de la racine du serveur (DOCUMENT_ROOT). Utilisez le format suivant:

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

Si la page cible se trouve sur un autre serveur, vous devez inclure 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 caractère ne devrait être envoyé avant l'en-tête - pas même 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 Search, ne prendront pas la redirection en compte lors de l'indexation.

Si vous souhaitez informer les moteurs de recherche qu'une page a été déplacée de manière permanente 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). Ainsi, si vous tapez la première URL dans Google, vous serez automatiquement redirigé vers le deuxième lien redirigé.

Interprétation de PHP Code

Le code PHP situé après l'en-tête () sera interprété par le serveur, même si le visiteur passe à 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 réduire la charge du serveur:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
6
Star

Le meilleur moyen 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");

Tout le code doit être exécuté avant la ligne ci-dessus.

Supposer,

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 sera pas redirigé vers l'emplacement (index.php).

5
sabuz

Oui, il est possible d'utiliser PHP. Nous allons rediriger vers une autre page.

Essayez le code suivant:

<?php
    header("location:./"); // Redirect to index file
    header("location:index.php"); // Redirect to index file
    header("location:example.php");
?>
4

pour rediriger utiliser ce code

header("Location: http://www.example.com/blog");
4
user8031209

Nous pouvons le faire de deux manières:

  1. Lorsque l'utilisateur se connecte https://bskud.com/PINCODE/BIHAR/index.php puis redirige vers https://bskud.com/PINCODE/BIHAR.php

    Par le code PHP ci-dessous

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

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

  2. Lorsqu'une condition est vraie, redirigez-vous vers une autre page:

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>
    
3
Kavita Sharma

1. Utilisation de header, une fonction intégrée PHP

a) Redirection simple sans paramètres

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

b) redirection avec les paramètres GET

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

2. Redirection avec JavaScript en PHP

a) Redirection simple sans paramètres

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

b) redirection avec les paramètres GET

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

Utilisation:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>

Vous pouvez essayer d'utiliser la fonction PHP header pour effectuer la redirection. Vous voudrez définir 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
Doruk Ayar

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

Redirect 301 / http://new-site.com/
1
jabko87

en utilisant ce code pour une meilleure redirection:

$ref="http://www.example.com';
echo '<script>window.location = "'.$ref.'";</script>';  
exit;
1
user8031209

Il existe plusieurs façons de procéder, mais si vous préférez php, je vous recommande d’utiliser la fonction header().

Fondamentalement

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

Si vous voulez passer à la vitesse supérieure, il est préférable de l’utiliser dans des fonctions. De cette façon, vous pouvez y ajouter des authentifications et d’autres éléments de vérification.

Essayons avec en vérifiant le niveau de l'utilisateur.

Supposons donc que vous avez 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 souhaitez authentifier.

Comme dans page.php ou toute autre page.

<?php

    // page.php

    require “function.php”

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, “www.someotherplace.com/somepage.php”);

    . . .

Références;

1
Pyr James