155 votes

Session PHP perdue après la redirection

Comment résoudre le problème de la perte d'une session après une redirection en PHP?

Récemment, j'ai rencontré un problème très courant de perte de session après redirection. Et après une recherche sur ce site, je ne trouve toujours pas de solution (bien que ce soit le plus proche). Mais maintenant que je l'ai fait, j'ai pensé poster une réponse ici pour aider toute personne rencontrant le même problème.

241voto

dayuloli Points 1349

Tout d'abord, mener à bien ces contrôles habituels:

  1. Assurez - session_start(); est appelé avant que les séances sont appelés. Donc, d'un coffre-fort pari serait de le mettre au début de votre page, immédiatement après l'ouverture <?php balise avant toute autre chose. Aussi il n'y a pas d'espaces/tabulations avant l'ouverture <?php balise.
  2. Après l' header redirection à la fin du script courant à l'aide de exit(); (d'Autres ont également proposé session_write_close(); et session_regenerate_id(true), vous pouvez essayer aussi, mais je ne l'utiliserais exit();)
  3. Assurez-vous que les cookies sont activés dans le navigateur que vous utilisez pour faire des tests.
  4. Garantir register_globals est désactivé, vous pouvez le vérifier sur l' php.ini le fichier et également à l'aide de phpinfo(). Reportez-vous pour cela à la façon de l'éteindre.
  5. Assurez-vous de ne pas supprimer ou vider la session
  6. Assurez-vous que la clé dans votre $_SESSION tableau superglobal n'est pas écrasé n'importe où
  7. Assurez-vous que vous rediriger vers le même domaine. Si la redirection à partir d'un www.yourdomain.com de yourdomain.com ne portent pas la session de l'avant.
  8. Assurez-vous que votre extension de fichier est - .php (ça arrive!)

Maintenant, ce sont les erreurs les plus courantes, mais si ils n'ont pas le problème, le problème est plus susceptible de faire avec votre société d'hébergement. Si tout fonctionne sur localhost mais pas sur votre télécommande/serveur de test, alors c'est probablement le coupable. Afin de vérifier les connaissances de base de votre fournisseur d'hébergement (essayer aussi de leurs forums, etc). Pour des entreprises comme FatCow et iPage, ils vous demandent de spécifier session_save_path. Donc, comme ceci:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();

(remplacez "votre maison chemin d'accès au répertoire" avec votre maison chemin d'accès au répertoire. C'est généralement à l'intérieur de votre panneau de contrôle (ou l'équivalent), mais vous pouvez également créer un test.php le fichier sur la racine de votre répertoire et tapez:

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>

Le peu d'avant "test.php' est votre maison chemin d'accès au répertoire. Et bien sûr, assurez-vous que le dossier existe réellement dans votre répertoire racine. (Certains programmes ne pas télécharger les dossiers vides lors de la synchronisation)

2voto

sclarky Points 68

Cela m'a stoppé pendant un long moment (et ce post était génial à trouver!) Mais pour tous ceux qui ne peuvent toujours pas avoir de sessions entre les redirections de pages au travail ... j'ai dû aller dans le fichier php.ini et activer les cookies :

 session.use_cookies = 1 
 

Je pensais que les sessions fonctionnaient sans cookies… En fait, je sais qu'elles DEVRAIENT… mais cela a résolu mon problème au moins jusqu'à ce que je puisse comprendre ce qui peut se passer dans l'ensemble.

0voto

grenoult Points 43

J'ai eu le même problème, mais seulement sur Chrome.

Firefox et IE (étonnamment) fonctionnaient bien.

Les cookies étaient déjà activés.

Comme l'a dit dayuloli, l'ajout de session_regenerate_id(true) après header corrigé.

Merci!

0voto

Phillip-Marsden Points 71

J'ai aussi eu le même problème avec la redirection ne fonctionne pas et j'ai essayé toutes les solutions que j'ai pu trouver, mon header de redirection a été utilisé dans un formulaire.

Je l'ai résolu en mettant l'en-tête de redirection dans une autre page php 'signin_action.php" et en passant les variables des paramètres par le biais je voulais dans les paramètres d'url et puis à la réaffectation dans l' 'signin_action.php" la forme.

signin.php

if($stmt->num_rows>0) {
$_SESSION['username'] = $_POST['username'];
echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>';
error_reporting(E_ALL);

signin_action.php

<?php
require('../../config/init.php');
$_SESSION['username'] = $_GET['username'];
if ($_SESSION['username']) {

echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>';
exit();
} else {
echo 'Session not set';
}

?>

Ce n'est pas un beau travail, mais cela a fonctionné.

-5voto

Josh Ginn Points 1

Assurez-vous qu'une nouvelle session est créée correctement en détruisant d'abord l'ancienne session.

     session_start();
    // remove all session variables
    session_unset();
    // destroy the session
    session_destroy();
    session_start();
    $_SESSION['username'] = 'username';
 

Oui, session_start () est appelé deux fois. Une fois pour appeler les commandes unset et destroy et une seconde fois pour démarrer une nouvelle session.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X