2009-08-10 10 views
3

Dans un fichier PHP lorsque je dois rediriger un utilisateur et que les en-têtes sont déjà envoyés, je ne peux pas utiliser la fonction d'entête de php, dans ce cas, quelle est la meilleure méthode pour rediriger un utilisateur?Meilleures méthodes de redirection?

La méthode la plus rapide et la plus fiable quelle que soit la marque du navigateur de l'utilisateur?

echo '<script type="text/javascript">window.top.location="http://localhost/";</script>'; 

// OR 

echo '<meta http-equiv="refresh" content="0;url=' .$location. '">'; 

MISE À JOUR

Voici mon code de résultat final, je suis maintenant en utilisant, si les en-têtes sont déjà envoyés où je ne peux pas rediriger vers la page d'accueil, je vous apporte juste la page d'accueil pour moi, donc au lieu d'inclure la page du corps, il inclura ma page d'accueil et pied de page

function validlogin($url) { 
    if (!isset($_SESSION['auto_id']) || ($_SESSION['auto_id']=='')) { 
     $_SESSION['sess_login_msg'] = 'Please login'; 
     $_SESSION['backurl'] = $url; 
     $temp = ''; 
     if (headers_sent() === false){ 
      header("Location: /"); 
      exit(); 
     }else{ 
      //header is already sent so we will just bring the homepage to us instead of going to it!!! 
      include 'mainbody.inc.php'; 
      include 'footer.inc.php'; 
      exit(); 
     } 
    } 
} 

Répondre

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

    exit(); 
} 

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

De nouveau, utilisez ob_start();

+0

Ceci est sur la bonne voie pour ma solution, IDK pourquoi quelqu'un continue de downvoting tout le monde qui ne dit pas "tampon de sortie", j'ai une bonne idée de qui il est cependant. Voir avec votre méthode, je peux ajouter à ma fonction existante, si l'en-tête est déjà envoyé, alors je peux simplement inclure ma page d'accueil au lieu de la rediriger vers elle, excellente solution! – JasonDavis

+0

Je réclame tous mes downvotes, pour l'enregistrement. Vous incluez la méthode ressemble à ça va fonctionner très bien. Au début de ce post, nous savions seulement que vous vouliez rediriger. Plus d'informations est toujours mieux :) –

-1

Je dirais la seconde.

Si l'utilisateur a javascript désactivé, ou utilise un navigateur sans javascript, la 1ère redirection ne fonctionnera jamais.

+0

Vous pouvez également regarder la mise en mémoire tampon de sortie en PHP. Cela vous permettrait d'utiliser la redirection côté serveur. http://us2.php.net/manual/fr/ref.outcontrol.php – easement

+0

Je me demande si la méta-redirection est toujours supportée? – JasonDavis

+1

Dans les deux cas, ils tuent tous les deux le bouton de retour. –

7

N'utilisez aucun de ces éléments! Vous devriez toujours utiliser les redirections HTTP.

Utilisez ob_start() pour mettre en mémoire tampon le contenu et éviter les problèmes d'en-têtes déjà envoyés.

Vous pouvez également essayer d'écrire une application MVC, où vous saurez si vous avez besoin de rediriger avant de sortir quelque chose (mais avec ob_start() qui n'est pas nécessaire).

+0

Je suis d'accord. Vous devriez être capable de contrôler la sortie de votre application et utiliser les en-têtes HTTP. Si vous ne pouvez absolument pas faire cela, utilisez la 2ème option. +1 à cette réponse –

+0

Je ne sais pas beaucoup sur la façon dont le tampon ob fonctionne, mais ne met-il pas toute la page en mémoire avant d'afficher, ce ne peut pas être bon pour la performance sur un site à fort trafic peut-il? – JasonDavis

+0

Certains tests ont trouvé beaucoup de petites sorties sont plus lentes alors un plus grand lot iirc. A besoin de googler ou de tester. – OIS

2

ferroutage sur porneL:

L'énorme problème avec vos méthodes: vous tuez le bouton de retour. Tuer le bouton de retour est la chose la plus irritante sur le web.

Je n'ai jamais trouvé un besoin de rediriger après que les en-têtes ont été envoyés. Vous devriez probablement repenser ce que vous essayez de faire.

+1

Je suis complètement d'accord. Si vous avez besoin d'envoyer des en-têtes APRÈS que vous ayez sorti quelque chose, vous le faites mal. – usoban

+0

Dans mon cas, la seule fois où je redirige est après avoir envoyé un formulaire ou si un utilisateur est déconnecté, je redirige vers une page de connexion, donc le bouton retour ne doit pas être utilisé de toute façon – JasonDavis

+0

J'ai un fichier d'en-tête qui est dans chaque page puis j'ai le fichier corps inclus sous l'en-tête, maintenant seulement certaines pages nécessitent un utilisateur être connecté, donc sur ces pages est où j'appelle une fonction qui vérifie si connecté et si non, il essaie de rediriger, donc comme il est dans le fichier body, l'en-tête a déjà été chargé avant de pouvoir voir s'il doit rediriger – JasonDavis