Comment faire une redirection en PHP?

1262

Est-il possible de rediriger un utilisateur vers une autre page grâce à l'utilisation de PHP?

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

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

Sam
la source
Vous pouvez mettre à jour l'en-tête en PHP: header
Zack Marrapese
11
@ Sam: tout comme noeud côté, ne mettre en œuvre aucune sorte de protection from unauthorized usersvia redirect; ce n'est pas ainsi qu'il faut faire les choses;)
Strae
7
@Strae Quel est le problème avec la protection des pages avec redirection? Alors quelle est la meilleure façon?
6
La redirection @PravindaAmarathunga est l'un des éléments, mais pas le seul. Assurez-vous simplement que les éléments protégés ne sortent pas du tout pour les utilisateurs non autorisés; La redirection du navigateur peut être désactivée côté client, par exemple: si le navigateur ne fait pas la redirection et que la page d'origine est sortie normalement, que verrait l'utilisateur? Le CMS fait généralement la redirection et n'imprime pas les éléments protégés, remplaçant la sortie normale par un message de courtoisie.
Strae
@PravindaAmarathunga vérifier le lien de la réponse de Markus: thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

Réponses:

1699

Résumé des réponses existantes plus mes propres deux cents:

1. Réponse de base

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

header('Location: '.$newURL);

2. Détails importants

mourir () ou sortir ()

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

Pourquoi devriez-vous utiliser die()ou exit(): Le Daily WTF

URL absolue ou relative

Depuis juin 2014, des 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

L'en-tête "Location" de PHP utilise toujours le code direct HTTP 302 , mais ce n'est pas celui que vous devez utiliser. Vous devriez considérer 301 (redirection permanente) ou 303 (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 utilisateurs HTTP / 1.1. Cela n'est pas vrai pour de nombreux autres agents utilisateurs comme les araignées et les robots.

3. Documentation

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

4. Alternatives

Vous pouvez utiliser la méthode alternative http_redirect($url);dont le package PECL pecl doit être installé.

5. Fonctions d'assistance

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

Comme mentionné, les header()redirections ne fonctionnent qu'avant que quoi que ce soit ne soit écrit. Ils échouent généralement s'ils sont invoqués en sortie HTML . Ensuite, vous pouvez utiliser une solution de contournement d'en-tête HTML (pas très professionnelle!) Comme:

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

Ou même une redirection JavaScript.

window.location.replace("http://example.com/");
markus
la source
5
Quelques problèmes avec cette réponse: 303 n'est peut-être pas le code d'état "correct". 301 peut être souhaité pour Google, par exemple. Deuxièmement, cela header('Location: '.$newURL);doit être avant que tout HTML (ou texte) ait été transmis au navigateur, sinon cela ne fonctionnera pas correctement.
Chuck Le Butt
6
Malheureusement, l'histoire quotidienne de la WTF est courante. Quoi qu'il en soit, ce n'est pas le dé manquant qui cause le problème mais un mauvais design. Arrêter le processus violemment est une erreur dans 99,9% des cas. Une solution courante et plus propre (pas ma préférée de toute façon) consiste à lancer une exception RedirectionException et à l'attraper sur le point d'entrée de votre application. Après cela, vous pouvez avoir tous vos appels "après *" (journaux / fermer les connexions / quoi que ce soit)
robertodecurnex
4
Le http-equiv="Location"n'est pas pris en charge par tous les navigateurs. Vous devriez utiliser à la refreshplace! <meta http-equiv="refresh" content="0;url=http://example.com/">
Timo002
71
Ne jamais émettre un 301 à moins que vous l' entendez . 301 signifie permanent et permanent signifie permanent , ce qui signifie qu'il sera mis en cache par les agents utilisateurs, ce qui signifie de longues nuits remplies de caféine en regardant les journaux d'application se demandant si vous devenez fou parce que vous jurez qu'une page aurait dû être appelée ou mise à jour et vous jurez pour Dieu, cela fonctionne sur votre machine mais pas sur celle du client. Si vous devez absolument appeler un 301, mettez un cache-control max-age sur la ressource. Vous n'avez pas une sagesse infinie et vous ne devriez pas agir comme vous.
madumlao
2
Mais y a-t-il une raison d'utiliser le die over exit? la sortie semble plus propre et plus appropriée.
ars265
122

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

header('Location: '.$newURL);

Contrairement à ce que certains pensent, cela die()n'a rien à voir avec la redirection. Utilisez-le uniquement si vous souhaitez rediriger au lieu 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 réel. Cela n'a rien à voir avec le client "respectant" l'en- Location:tête. L'envoi d'un en-tête n'arrête pas l'exécution de PHP, quel que soit le client utilisé.

vartec
la source
8
die () ou exit () est destiné aux clients qui ne respectent pas l'en-tête "Location: ..."
clawr
12
@clawr: Non, exit()c'est pour empêcher la page d'afficher le contenu restant (pensez aux pages restreintes). vartec a raison, cela n'a rien à voir avec l'en-tête Emplacement HTTP et vous n'en avez pas besoin exit. J'ai choisi de l'inclure dans ma réponse parce que, pour quelqu'un qui ne sait pas comment faire une simple redirection, on pourrait tout aussi bien jouer en toute sécurité plutôt que de ne pas mettre en œuvre une étape simple mais cruciale juste pour qu'il puisse profiter d' un processus avancé contrôle.
Alix Axel
1
Mais les navigateurs qui respectent l'en-tête quitteront la page et fermeront la connexion pendant que votre script est en cours d'exécution. C'est totalement mauvais. PHP continuera avec le script pendant un certain temps (c'est pourquoi votre code s'exécute) mais peut l'abandonner de manière aléatoire au milieu de l'exécution, laissant les choses cassées. Appeler ignore_user_abort () empêchera cela, mais sincèrement, je n'en vaut pas la peine. Continuez simplement avec vos trucs d'écriture HTML (bien que probablement inutiles) mais ne faites pas de trucs qui écrivent sur le disque ou la base de données après un en-tête ('Location:'); Écrivez sur le disque avant la redirection si possible. [Aussi: l'url doit être absolue.]
FrancescoMM
existe-t-il un moyen de rediriger avant que le navigateur ne détecte le protocole HTTP? la raison pour laquelle je dois rediriger est parce que je ne peux pas obtenir suffisamment de certificats SSL pour tous mes domaines. j'utiliserais .htaccesspour rediriger, mais j'ai besoin d'un moyen de transmettre en quelque sorte quel domaine redirigé vers le domaine final?
oldboy
109
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 ()!

Alix Axel
la source
6
Et n'oubliez pas la mise en mémoire tampon de sortie ou vous vous retrouverez avec «En-têtes déjà envoyés».
Kuroki Kaze
8
... et n'oubliez pas d'imprimer quelque chose comme "vous serez redirigé vers $ nepage en $ n secondes, cliquez sur le lien $ ici si la redirection ne se produit pas" Certains navigateurs et certains paramètres du navigateur peuvent échouer cette redirection.
Strae
3
@DaNieL: ce type de redirection ne prendra pas "$ n secondes". Ce sera instantané si cela se produit, et tout navigateur conforme devrait le gérer. Je pense que vous pensez aux redirections "meta refresh" que les gens utilisent lorsqu'ils ne connaissent pas mieux.
rmeador
1
@rmeador ... Pour les navigateurs plus anciens et les navigateurs spécialisés. Vous devez d'abord faire votre en-tête d'emplacement, si les échecs ont une méta-redirection avec le "vous serez redirigé vers la page en x secondes" avec un lien en cas d'échec de la méta-redirection. C'est le moyen approprié et sûr de faire une redirection.
Andrew Moore
3
Andrew: comment le navigateur HTTP peut-il ne pas respecter l'emplacement:?
vartec
102

Sortie JavaScript 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, sauf si vous mettez en mémoire tampon la sortie de la page, puis vérifiez plus tard la condition de redirection. Cela pourrait être trop compliqué. N'oubliez pas que les en-têtes sont la première chose envoyée depuis la page. La plupart de la redirection est généralement requise plus tard dans la page. Pour cela, vous devez mettre en mémoire tampon toutes les sorties de la page et vérifier la condition de redirection plus tard. À ce stade, vous pouvez rediriger l'en-tête de l'utilisateur de la page () ou simplement faire écho à la sortie mise en mémoire tampon.

Pour en savoir plus sur la mise en mémoire tampon (avantages)

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

Hammad Khan
la source
2
Réponse simple et précise! Idéal pour une redirection de page simple!
Stathis Andronikos
Et de cette façon, vous ne rencontrez pas l' Cannot modify header information - headers already sent byerreur courante .
Kai Noack
1
@hmd, que faire si javascript est désactivé?
Istiaque Ahmed
@IstiaqueAhmed javascript est presque toujours activé ces jours-ci mais s'il est désactivé, vous pouvez utiliser le tampon PHP. Cette question SO répond à cela. Si vous utilisez PHP Buffering, vous n'avez pas besoin de cette méthode, je pense.
Hammad Khan
Faux, vous pouvez (et devriez) le faire en PHP même sans mise en mémoire tampon: dans une page bien conçue, tout le traitement PHP pertinent devrait avoir lieu avant que tout contenu HTML ne soit envoyé à l'utilisateur. De cette façon, les redirections PHP fonctionneront bien.
MestreLion
91

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 obtiendrez parfois "un avertissement comme l'en-tête déjà envoyé" pour résoudre ce problème qui ne résonnera pas ou ne s'imprimera pas 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 ne rencontrerez aucun problème

3. Utilisation de la fonction d'en-tête avec ob_start()etob_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
?>
Juned Ansari
la source
Travaillez comme un charme. J'utilise <? Php echo "<script> location.href = ' google.fr/ '; </script >"; ?> Pour le tester, et il a fait ce que je voulais
DoctorDroid Haiti
1
La deuxième solution ne fonctionnera pas avec JS désactivé.
Tajni
55

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

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

En laissant cette deuxième ligne vitale, vous pourriez vous retrouver sur The Daily WTF . Le problème est que les navigateurs ne doivent respecter les en- têtes qui votre déclaration de page, donc les en - têtes étant ignorés, le reste de la page sera exécutée sans redirection.

nickf
la source
1
Qu'en est-il de donner une sortie à l'utilisateur avant de tuer le script? Vous savez, les gens aiment savoir ce qui se passe ...
Strae
3
vous supposez que le script n'a rien d'autre à faire qu'à rediriger. Ce qui pourrait ne pas être vrai du tout.
vartec
13
@DaNieL: changez-le pour mourir ("Arrêtez d'ignorer mes en-têtes!")
nickf
3
J'ai aimé cette explication simple que die();vous avez donnée - si vous ne le faites pas, l'utilisateur peut voir la page complète pendant un moment si vous l'utilisez; l'utilisateur sera redirigé et aucun problème de contenu temporaire ne s'affichera + 1
TheBlackBenzKid
Il est possible qu'une activité utile se produise après l'envoi de l'en-tête, activité qui n'envoie rien au navigateur, mais enregistre l'activité ou termine l'enregistrement des transactions. Pour cette raison, le besoin de mourir / quitter dépend du script.
DanAllen
28

Utilisation:

<?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 d'inclure die().

jake
la source
25

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 cyberattaques et j'ai décidé que je devais connaître les utilisateurs essayant d'accéder au panneau d'administration ou à une 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.

Asuquo12
la source
19

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 souhaitez utiliser une URL relative et générer le reste, 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
Luc
la source
16

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

Daniel A. White
la source
existe-t-il un moyen de rediriger avant que le navigateur ne détecte le protocole HTTP? la raison pour laquelle je dois rediriger est parce que je ne peux pas obtenir suffisamment de certificats SSL pour tous mes domaines. j'utiliserais .htaccesspour rediriger, mais j'ai besoin d'un moyen de transmettre en quelque sorte quel domaine redirigé vers le domaine final?
oldboy
16

Utilisez le code suivant:

header("Location: /index.php");
exit(0);   
joan16v
la source
14

J'ai déjà répondu à cette question, mais je vais le faire à nouveau car en attendant, j'ai appris qu'il y a des cas particuliers si vous exécutez en CLI (les redirections ne peuvent pas se produire et ne devraient donc pas se produire exit()) ou si votre serveur Web est exécuter PHP en tant que (F) CGI (il a besoin d'un en- Statustête préalablement défini 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 également traité la question de soutenir les différents codes de redirection HTTP ( 301, 302, 303et 307), comme il a été abordé dans les commentaires de ma réponse précédente. Voici les descriptions:

  • 301 - Déplacé de façon permanente
  • 302 - trouvés
  • 303 - Voir les autres
  • 307 - Redirection temporaire (HTTP / 1.1)
Alix Axel
la source
11

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.phpc'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

Lorsqu'il s'agit de chemins relatifs ou absolus, il est idéal de choisir un chemin absolu à la racine du serveur (DOCUMENT_ROOT). Utilisez le format suivant:

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

Si jamais la page cible se trouve 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 à beforetout type de contenu. Cela signifie qu'aucun caractère ne doit être envoyé avant l'en-tête - pas même un espace vide!

Redirection temporaire / permanente

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

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

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

Par exemple, cette page contient 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é en permanence). Donc, si vous saisissez la première URL dans Google, vous serez automatiquement redirigé vers le deuxième lien redirigé.

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 vers 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 header()fonction de la exit()fonction afin de diminuer la charge du serveur:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>
Étoile
la source
Pourquoi (vers la fin du deuxième paragraphe)? Voulez-vous dire à la &paraplace (donc l'ensemble se lit mypage.php?param1=val1&param2=val2))? (L'entité HTML para ) est "¶" - peut-être qu'un programme externe a fait une conversion?).
Peter Mortensen
9

Utilisation:

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

Il s'agit d'une redirection PHP régulière et normale, mais vous pouvez créer une page de redirection avec quelques secondes d'attente par le code ci-dessous:

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

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

Le W3C a la gentillesse de mentionner que l'en-tête 303 est incompatible avec "de nombreux agents utilisateurs pré-HTTP / 1.1", ce qui équivaudrait à aucun navigateur en cours d'utilisation. Ainsi, le 302 est une relique, qui ne devrait pas être utilisée.

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

Henrik Paul
la source
7

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");

Vikram Pote
la source
Javascript fonctionne sur le client qui peut être ou non ce que vous recherchez.
chharvey
7

Oui, vous pouvez utiliser la fonction header () ,

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

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

Selon la documentation, header()doit être appelé avant d'envoyer une sortie réelle.

Casper
la source
6

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

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

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

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

Brent
la source
but you need to do it before you've sent any other output to the browser. Impressionnant!! J'ai cherché pendant des minutes pourquoi j'avais continué à recevoir les en-têtes qui avaient déjà envoyé une erreur. +1 !!
josh
Plus généralement, vous avez / arrêtez complètement votre script /. die()est juste une façon de le faire.
MauganRa
6

Voici mes pensées:

À mon humble avis, la meilleure façon 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 commencera à rediriger l'utilisateur. Cependant, assurez-vous qu'il n'y a pas eu de sortie (aucun echo / var_dump) avant d'envoyer des en-têtes, sinon cela entraînera des erreurs.

Bien que ce soit un moyen rapide et sale de réaliser ce qui était initialement demandé, cela se révélera finalement être un désastre SEO, car ce type de redirection est toujours interprété comme une redirection 301/302, donc les moteurs de recherche verront toujours votre page d'index en tant que page redirigée, et non quelque chose d'une page de destination / page principale.

Par conséquent, cela affectera les paramètres SEO du site Web.

Bhaskar Pramanik
la source
1
exit () doit être utilisé immédiatement après l'en-tête ()
EKanadily
@docesam .. convenu .. exit () doit être appelé immédiatement après l'appel de header (). Cependant, je pense que s'il n'y a plus de sortie vers le navigateur après cette instruction header (), exit () peut ne pas être nécessaire - Juste mon avis
Bhaskar Pramanik
oui mais vous devez expliquer cela parce que quelqu'un pourrait copier votre ligne de code dans son script et cela peut potentiellement causer de longs temps de cercle autour de lui pour trouver ce qui ne va pas.
EKanadily
1
@BhaskarPramanik imaginez que vous devez verrouiller une porte rapidement, mais vous devez ensuite la tirer / la pousser / la casser à nouveau pour vous assurer qu'elle est déjà verrouillée ou non ..
aswzen
5

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");

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

sabuz
la source
Il y a déjà une réponse qui a 1085 qui contient les informations que vous fournissez, et bien plus encore.
Patrick Hund, le
5

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");
?>
Bhargav Chudasama
la source
4

1. Utilisation d' headerune fonction PHP intégrée

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>";
   ?>
Shaan Ansari
la source
Le bit javascript était en quelque sorte la seule chose qui fonctionnait dans l'hébergement final du site; Je crois que c'est une question de mise en cache mais avec ça je l'ai résolu tout de suite.
cdsaenz
3

Nous pouvons le faire de deux manières:

  1. Lorsque l'utilisateur vient sur 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-la 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>";
        }
    ?>
Kavita Sharma
la source
Qu'est-ce que c'est? Veuillez ne pas utiliser de liens vers votre propre site Web. Et le deuxième exemple utilise la redirection javascript, et non la header()fonction PHP .
Scriptman
2

Utilisation:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>
Joshua Charles Pickwell
la source
1
Pourriez-vous expliquer la fonction de votre code? Votre réponse a été signalée en raison de sa longueur et de son contenu.
www139
2

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

Fondamentalement

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

Si vous voulez le faire monter d'un cran, il est préférable de l'utiliser dans les fonctions. De cette façon, vous pouvez y ajouter des authentifications et d'autres contrôles.

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

Supposons donc que vous ayez stocké le niveau d'autorisation 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 ensuite la fonction pour chaque page que vous souhaitez authentifier.

Comme dans page.phpou sur 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;

Pyr James
la source
2

J'aime le genre de redirection au fil du temps.

<?php

header("Refresh: 5;url=índex.php");
PauloBoaventura
la source
2

Utilisation de la fonction d'en-tête pour le routage

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

Supposons que nous voulons router du fichier A.php vers B.php que nous devons utiliser l'aide de <button>ou <a>. Voyons un exemple

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>
Mehedi Abdullah
la source
Pouvez-vous fournir la solution exacte ou la bonne?
Mehedi Abdullah
Il existe déjà de nombreuses solutions. Votre solution a mélangé HTML et PHP sans balises PHP. Deuxièmement, vous envoyez l'en-tête après l'impression du code html, donc cela ne fonctionnera pas. Et le nom des fichiers d'exemple est mauvais. Vous ne devriez pas les nommer A.php et B.php. Je sais que ce n'est qu'un exemple, mais vous devriez toujours vous soucier de la convention de dénomination.
Tajni
1

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

Redirect 301 / http://new-site.com/
michal.jakubeczy
la source
1

Vous pouvez essayer d'utiliser la headerfonction PHP pour effectuer la redirection. Vous souhaiterez définir le tampon de sortie afin que votre navigateur ne lance pas un avertissement de redirection à l'écran.

ob_start();
header("Location: " . $website);
ob_end_flush();
Doruk Ayar
la source
1
exit () doit être utilisé immédiatement après l'en-tête (). la mise en mémoire tampon de la sortie est également activée par défaut depuis un certain temps maintenant.
EKanadily
0

essaye celui-là

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
Shareque
la source