web-dev-qa-db-fra.com

PHP session 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 ceci soit le plus proche) 

Mettre à jour

J'ai trouvé la réponse et je pensais la poster ici pour aider toute personne confrontée au même problème.

109
dayuloli

Tout d’abord, effectuez les vérifications habituelles:

  1. Assurez-vous que session_start(); est appelé avant toute session. Il serait donc sage de le placer au début de votre page, immédiatement après la déclaration d'ouverture <?php avant toute autre chose. Assurez-vous également qu'il n'y a pas d'espaces/de tabulations avant la déclaration d'ouverture <?php.
  2. Après la redirection header, terminez le script actuel en utilisant exit(); (D'autres personnes ont également suggéré session_write_close(); et session_regenerate_id(true), vous pouvez également les essayer, mais j'utiliserais exit();).
  3. Assurez-vous que les cookies sont activés dans le navigateur que vous utilisez pour le tester.
  4. Assurez-vous que register_globals est désactivé, vous pouvez le vérifier dans le fichier php.ini et également à l'aide de phpinfo(). Reportez-vous à this pour savoir comment l’éteindre.
  5. Assurez-vous que vous n'avez pas supprimé ou vidé la session
  6. Assurez-vous que la clé de votre tableau $_SESSION superglobal n'est écrasée nulle part.
  7. Assurez-vous de rediriger vers le même domaine. Donc, la redirection d'un www.yourdomain.com vers yourdomain.com ne reporte pas la session.
  8. Assurez-vous que votre extension de fichier est .php (ça arrive!)

Maintenant, ce sont les erreurs les plus courantes, mais s’ils ne le font pas, le problème est le plus susceptible de se produire avec votre société d’hébergement. Si tout fonctionne sur localhost mais pas sur votre serveur distant/test, c'est probablement le coupable. Vérifiez donc la base de connaissances de votre fournisseur d'hébergement (essayez également leurs forums, etc.). Pour les entreprises telles que FatCow et iPage, vous devez spécifier session_save_path. Alors comme ça:

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

(remplacez "votre chemin de répertoire de base" par votre chemin de répertoire de base actuel. Cela se trouve généralement dans votre panneau de configuration (ou son équivalent), mais vous pouvez également créer un fichier test.php dans votre répertoire racine et tapez:

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

Le bit avant 'test.php' est le chemin de votre répertoire personnel. Et bien sûr, assurez-vous que le dossier existe bien dans votre répertoire racine. (Certains programmes ne téléchargent pas de dossiers vides lors de la synchronisation)

175
dayuloli

vous devriez utiliser "exit" après header-call

header('Location: http://www.example.com/?blabla=blubb');
exit;
21
KraftART Berlin

J'ai essayé toutes les solutions possibles, mais aucune n'a fonctionné pour moi! Bien sûr, j'utilise un service d'hébergement partagé.

Finalement, j'ai contourné le problème en utilisant "URL relative" dans l'en-tête de redirection!

header("location: http://example.com/index.php")

annulé les cookies de session

header("location: index.php")

travaillé comme un charme!

13
ali al-juanidi

J'ai eu le même problème. J'ai travaillé dessus pendant plusieurs heures et cela m'a rendu fou.

Dans mon cas, le problème était un 404 appelé en raison de un favicon.ico manquant dans Chrome et Firefox uniquement. Les autres navigateurs ont bien fonctionné.

4
Jeremie

J'ai eu un problème similaire, bien que mon contexte soit légèrement différent… .. J'avais une configuration de développement locale sur une machine dont le nom d'hôte était windows et l'adresse IP 192.168.56.2.

Je pouvais accéder au système de l'une des manières suivantes:

Une fois connecté, mon code PHP serait redirigé à l'aide de:

header('http://windows/');

Si le nom de domaine précédent utilisé pour accéder au système n'était pas windows, les données de session seraient perdues. J'ai résolu ceci en remplaçant le code par:

header('http://'.$_SERVER['HTTP_Host'].'/');

Il fonctionne maintenant quels que soient le nom de domaine local ou l'adresse IP de l'utilisateur.

J'espère que cela peut être utile à quelqu'un.

3
Stephen K. Karanja

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 la réalité.

3
sclarky

Je suis tombé sur cette question sur une page particulière. Je définissais les valeurs $ _SESSION dans les autres pages juste avant la redirection et tout fonctionnait correctement. Mais cette page particulière ne fonctionnait pas.

Finalement, j'ai réalisé que dans cette page particulière, je détruisais la session au début de la page, mais je ne la recommenais jamais. Donc, ma fonction de destruction a changé de:

function sessionKill(){

    session_destroy();

}

à:

function sessionKill(){

    session_destroy();
    session_start();

}

Et tout a fonctionné!

3
NicB

J'avais le même problème. Soudainement, certaines de mes variables de session ne persisteraient pas à la page suivante. Le problème s'est avéré être (dans php7.1) votre emplacement en-tête ne doit pas contenir de WWW, ex https: // mysite . est ok, https: //www.mysite . perdra les variables de session de cette page. Pas tous, juste cette page.

2
Wynn

Si vous utilisez session_set_cookie_params(), vous voudrez peut-être vérifier si vous transmettez le quatrième param $secure en tant que true. Si vous l'êtes, vous devez accéder à l'URL à l'aide de https.

Le paramètre $secure étant true, cela signifie que la session n'est disponible que dans une demande sécurisée. Cela pourrait vous affecter localement plus que dans les environnements de scène ou de production.

En le mentionnant parce que je viens de passer la majeure partie de la journée à essayer de trouver ce problème, et c’est ce qui a résolu le problème. Je viens d'être ajouté à ce projet et personne n'a mentionné qu'il nécessitait https.

Vous pouvez donc utiliser https localement ou définir le paramètre $secure sur FALSE, puis utiliser http localement. Assurez-vous simplement de le redonner à true lorsque vous poussez vos modifications vers le haut.

Selon votre serveur local, vous devrez peut-être modifier DocumentRoot dans le httpd-ssl.conf du serveur afin que votre URL locale soit servie https.

1
Andy Huggins

Une autre raison possible:

C'est l'espace de stockage de mon serveur. Mon espace disque du serveur est saturé. J'ai donc supprimé quelques fichiers et dossiers de mon serveur et essayé.

C'était travaillé !!!

Je suis en train de sauvegarder ma session dans AWS Dynamo DB, mais le serveur attend toujours de l'espace sur mon serveur pour traiter la session. Pas certain de pourquoi!!!

1
Jayaprakash

Cela fait des jours que je lutte avec cela, vérifiant/essayant toutes les solutions, mais le problème est que je n’ai plus appelé session_start(); après la redirection. J'ai juste supposé que la session était «toujours en vie».

Alors n'oublie pas ça!

1

J'ai eu le même problème et j'ai trouvé le moyen le plus simple… .. J'ai simplement redirigé vers une redirection .html avec 1 ligne de JS

<!DOCTYPE html>
<html>
<script type="text/javascript">
<!--
window.location = "admin_index.php";
//–>
</script>
</html>

au lieu de PHP

header_remove();
header('Location: admin_login.php');
die;

J'espère que ça aide.

Amour Gram

1
Gramrock

Tout d’abord, assurez-vous d’appeler session_start() avant d’utiliser la variable $_SESSION.

Si vous avez désactivé le rapport d'erreur, essayez de l'activer et de voir le résultat.

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Les raisons les plus courantes qui ne sont pas mentionnées dans la réponse de @ dayuloli:

  1. Problème d'espace disque. Assurez-vous que votre espace disque n'est pas saturé, vous avez besoin d'un peu d'espace pour stocker les fichiers de session.

  2. Le répertoire de session peut ne pas être accessible en écriture. Vous pouvez le vérifier avec is_writable(session_save_path())

0
F0G

La solution rapide et efficace pour moi consistait simplement en une double redirection. J'ai créé 2 fichiers: fb-go.php et fb-redirect.php

fb-go.php ressemblait à:

session_start();

$_SESSION['FBRLH_state'] = 'some_unique_string_for_each_call';

header('Location: fb-redirect.php');

et fb-redirect:

session_start();

header('Location: FULL_facebook_url_with_' . $_SESSION['FBRLH_state'] . '_value');

Il convient également de mentionner le comportement du navigateur Android Chrome. Où l'utilisateur peut voir quelque chose comme ça:

Android

Si l'utilisateur choisit l'application Facebook, la session est perdue à cause de l'ouverture dans le navigateur Facebook - pas de Chrome, qui stocke les données de session de l'utilisateur.

0
instead

Pour moi, Firefox a enregistré l'identifiant de session (PHPSESSID) dans un cookie, mais Google Chrome a utilisé le paramètre GET ou POST . Il vous suffit donc de vous assurer que le script renvoyé (pour moi: Paypal checkout) est valide. PHPSESSID dans le paramètre url ou POST.

0
almisoft

Aujourd'hui, j'ai eu ce problème dans un projet et j'ai dû changer ce paramètre en false (ou supprimer les lignes, par défaut, il est désactivé):

ini_set( 'session.cookie_secure', 1 );

Cela est dû au fait que le projet actuel fonctionne sur http et pas uniquement https Plus d'informations dans les documents http://php.net/manual/fr/session.security.ini.php

0
Oscar

OP n'a pas spécifié s'il redirige vers la même page (par exemple, après la connexion), le cas échéant, la mise en cache du serveur/navigateur pourrait également être

Une solution de contournement simple consisterait à ajouter le numéro de version à la fin de l'URL (comme vous le feriez pour forcer l'actualisation du fichier .CSS).

Exemple:

header('Location: index.php?v='.time());

Donc, l'utilisateur est redirigé vers ce qui est traité comme une nouvelle page

domain.com/index.php?v=122234982323
0
Robert Sinclair

Après avoir essayé de nombreuses solutions ici sur SO et sur d'autres blogs ... ce qui a fonctionné pour moi a été d'ajouter .htaccess à la racine de mon site Web.

RewriteEngine on
RewriteCond %{HTTP_Host} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
0
Vishal Kumar
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();

Trop tard pour répondre mais cela a fonctionné pour moi

0
ViperTecPro

Rien n'a fonctionné pour moi mais j'ai trouvé ce qui causait le problème (et le résolvais):

Vérifiez les cookies de votre navigateur et assurez-vous qu’il n’existe pas de cookies de session php sur différents sous-domaines (comme un pour " www.website.com " et un pour " website.com ").

Cela était dû à un javascript qui utilisait incorrectement le sous-domaine pour définir des cookies et ouvrir des pages dans des iframes.

0
Julius S.

Pour moi, c'était une erreur de permission et cela l'a résolu:

chown -R nginx: nginx/var/opt/remi/php73/lib/php/session

J'ai testé quelques heures sur PHP et le dernier test effectué était la création de deux fichiers, session1.php et session2.php.

session1.php:

session_start();

$_SESSION["user"] = 123;

header("Location: session2.php");

session2.php:

session_start();

print_r($_SESSION);

et il imprimait un tableau vide.

À ce stade, je pensais que cela pourrait être un problème de serveur et en fait, ce l'était.

J'espère que ça aide quelqu'un.

0
temo

Assurez-vous que session_write_close n'est pas appelé entre session_start() et lorsque vous définissez votre session.

session_start();

[...]

session_write_close();

[...]

$_SESSION['name']='Bob'; //<-- won't save
0
Jordan Daigle

J'ai corrigé en donnant des autorisations d'écriture au groupe sur le chemin où PHP stockait les fichiers de session. Vous pouvez trouver le chemin de session avec la fonction session_save_path ().

0
franzisk

Pour moi, l'erreur a été d'essayer de sauvegarder un objet non sérialisable dans la session afin qu'une exception soit émise lors de l'écriture de la session. Mais puisque tout mon code de gestion d'erreur avait déjà cessé toute opération, je n'ai jamais vu l'erreur.

Je pouvais le trouver dans les journaux d'erreur Apache, cependant.

0
Björn Tantau

Quand j'utilise le chemin relatif "dir/file.php" avec dans la fonction header (), ça marche pour moi. Je pense que la session n'est pas enregistrée pour une raison quelconque lorsque vous redirigez en utilisant l'URL complète ...

//Does retain the session info for some reason
header("Location: dir");

//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")
0
user2999967

J'ai résolu ce problème après plusieurs jours de débogage et tout cela parce que mon URL de retour provenant de Paypal Express Checkout n'avait pas de «www». Chrome a reconnu que les domaines devraient être traités de la même manière, mais d'autres navigateurs ne l'ont parfois pas fait. Lorsque vous utilisez des sessions/cookies et des chemins absolus, n'oubliez pas le 'www'!

0
miapuffia

Maintenant que le GDPR est une chose, les visiteurs de cette question utilisent probablement un script de cookie. Eh bien, ce script a causé le problème pour moi. Apparemment, PHP utilise un cookie appelé PHPSESSID pour suivre la session. Si ce script le supprime, vous perdez vos données.

J'ai utilisé ce script cookie . Il a une option pour activer les cookies "essentiels". J'ai ajouté PHPSESSID à la liste, le script a cessé de supprimer le cookie et tout a recommencé à fonctionner.

Vous pouvez probablement activer certains paramètres PHP pour éviter d'utiliser PHPSESSID, mais si votre script de cookie est à l'origine du problème, pourquoi ne pas corriger that.

0
Hristiyan Dodov

Si vous utilisez Laravel et que vous rencontrez ce problème, vous devez enregistrer vos données de session avant de les rediriger.

session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
0
Aubrey Kodar

J'ai également eu le même problème avec la redirection ne fonctionne pas et j'ai essayé toutes les solutions que je pouvais trouver, ma redirection d'en-tête était utilisée dans un formulaire.

Je l'ai résolu en plaçant l'en-tête de redirection dans une page php différente, 'signin_action.php', en passant les paramètres de variables à l'aide de paramètres d'url puis en les réaffectant dans le formulaire 'signin_action.php'.

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 ça a fonctionné.

0
Stacker-flow

Pour mémoire, j'ai eu ce problème et après quelques heures à tout essayer, le problème était que le disque était plein et que les sessions PHP ne pouvaient pas être écrites dans le répertoire tmp ... aussi...

0
iperich

J'avais le même problème et je suis allé fou pour chercher la réponse dans mon code. Enfin, j'ai trouvé que mon hébergement avait récemment mis à jour la version PHP sur mon serveur et que le paramètre session_save_path n'était pas correctement configuré dans le fichier php.ini.

Donc, si quelqu'un lit ceci, veuillez vérifier php.ini config avant toute chose. 

0
Yova Turnes

Si vous utilisez Wordpress, je devais ajouter ce hook et démarrer la session sur init:

function register_my_session() {
    if (!session_id()) {
        session_start();
    }
}
add_action('init', 'register_my_session');
0
Jack Nicholson