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 avoir cherché sur ce site Web, je ne trouve toujours aucune solution (bien que ce soit le plus proche).
Mettre à jour
J'ai trouvé la réponse et j'ai pensé la publier ici pour aider toute personne rencontrant le même problème.
php
session
redirect
session-cookies
shared-hosting
Dayuloli
la source
la source
Réponses:
Effectuez d'abord ces vérifications habituelles:
session_start();
est appelé avant que des sessions soient appelées. Donc, une valeur sûre serait de le mettre au début de votre page, immédiatement après la<?php
déclaration d' ouverture avant toute autre chose. Assurez-vous également qu'il n'y a pas d'espaces / tabulations avant la<?php
déclaration d' ouverture .header
redirection, terminez le script actuel en utilisantexit();
(D'autres ont également suggérésession_write_close();
etsession_regenerate_id(true)
, vous pouvez également les essayer, mais j'utiliseraisexit();
)register_globals
- vous qu'il est désactivé, vous pouvez le vérifier sur lephp.ini
fichier et également en utilisantphpinfo()
. Reportez-vous à ceci pour savoir comment le désactiver.$_SESSION
tableau super global n'est écrasée nulle partwww.yourdomain.com
versyourdomain.com
ne fait pas avancer la session..php
(cela arrive!)Maintenant, ce sont les erreurs les plus courantes, mais si elles ne font pas l'affaire, le problème est probablement lié à votre société d'hébergement. Si tout fonctionne sur
localhost
mais pas sur votre serveur distant / de 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 comme FatCow et iPage, elles vous demandent de le précisersession_save_path
. Alors comme ça:(remplacez "votre chemin de répertoire personnel" par le chemin d'accès réel de votre répertoire personnel. Il se trouve généralement dans votre panneau de contrôle (ou équivalent), mais vous pouvez également créer un
test.php
fichier sur votre répertoire racine et saisir:Le bit avant «test.php» est le chemin de votre répertoire personnel. Et bien sûr, assurez-vous que le dossier existe réellement dans votre répertoire racine. (Certains programmes ne téléchargent pas de dossiers vides lors de la synchronisation)
la source
vous devriez utiliser "exit" après l'appel d'en-tête
la source
echo ' ';
) ou des espaces de quelque sorte que ce soit, il ignorera complètement l'en-tête de l'emplacement.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é.
En fin de compte, j'ai contourné le problème en utilisant 'url relative' dans l'en-tête de redirection!
annulé les cookies de session
a fonctionné comme un charme!
la source
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 d' un favicon.ico manquant dans Chrome et Firefox uniquement. Les autres navigateurs ont bien fonctionné.
la source
Quand j'utilise le chemin relatif "dir / file.php" avec la fonction header () fonctionne 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 ...
la source
Cela m'a déconcerté pendant longtemps (et cet article était super à trouver!) Mais pour tous ceux qui ne peuvent toujours pas faire fonctionner les sessions entre les redirections de page ... j'ai dû aller dans le fichier php.ini et activer les cookies :
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 une vue d'ensemble.
la source
J'ai eu un problème similaire, même si mon contexte était légèrement différent. J'avais une configuration de développement local sur une machine dont le nom d'hôte
windows
et l'adresse IP étaient192.168.56.2
.Je pourrais accéder au système en utilisant l'un des éléments suivants:
Après la connexion, mon code PHP serait redirigé en utilisant:
Si le nom de domaine précédent utilisé pour accéder au système ne l'était pas
windows
, les données de session seraient perdues. J'ai résolu cela en changeant le code en:Il fonctionne désormais quel que soit le nom de domaine local ou l'adresse IP que l'utilisateur insère.
J'espère que cela pourra être utile à quelqu'un.
la source
J'ai rencontré ce problème sur une page particulière. Je définissais les valeurs $ _SESSION dans d'autres pages juste avant la redirection et tout fonctionnait bien. 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 relançais jamais. Donc, ma fonction de destruction a changé de:
à:
Et tout a fonctionné!
la source
J'avais le même problème. Tout à coup, CERTAINES de mes variables de session ne persisteraient pas à la page suivante. Le problème s'est avéré être (en php7.1) que l'emplacement de l'en-tête ne doit pas contenir de WWW, ex https: // mysite . est ok, https: //www.mysite . perdra ces variables de session de pages. Pas tout, juste cette page.
la source
www.mysite.com
est considéré comme un domaine complètement différent deblog.mysite.com
ou simplementmysite.com
Je me débat avec cela depuis des jours, vérifiant / essayant toutes les solutions, mais mon problème était que je n'ai pas rappelé
session_start();
après la redirection. J'ai juste supposé que la session était «toujours vivante».Alors n'oublie pas ça!
la source
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
au lieu de PHP
J'espère que ça aide.
Amour Gram
la source
Si vous utilisez,
session_set_cookie_params()
vous voudrez peut-être vérifier si vous passez le quatrième paramètre$secure
commetrue
. Si c'est le cas, vous devez accéder à l'URL en utilisant https.Le
$secure
paramètre étant vrai signifie que la session n'est disponible que dans une demande sécurisée. Cela peut vous affecter localement plus que dans les environnements de scène ou de production.Le mentionner parce que je viens de passer la majeure partie de la journée à essayer de trouver ce problème, et c'est ce qui l'a résolu pour moi. Je viens d'être ajouté à ce projet et personne n'a mentionné qu'il nécessitait https.
Vous pouvez donc soit utiliser https localement, soit définir le paramètre
$secure
surFALSE
puis utiliser http localement. Assurez-vous simplement de le redéfinir sur vrai lorsque vous augmentez vos modifications.En fonction de votre serveur local, vous pourriez avoir à modifier
DocumentRoot
dans lehttpd-ssl.conf
du serveur afin que votre URL local est servi https.la source
Une autre raison possible:
C'est l'espace de stockage de mon serveur. L'espace disque de mon serveur est saturé. Ainsi, j'ai supprimé quelques fichiers et dossiers de mon serveur et essayé.
Cela a fonctionné !!!
J'enregistre ma session dans AWS Dynamo DB, mais il attend toujours de l'espace sur mon serveur pour traiter la session. Pas certain de pourquoi!!!
la source
Si vous utilisez Laravel et que vous rencontrez ce problème, vous devez enregistrer vos données de session avant de rediriger.
la source
J'ai également eu le même problème avec la redirection ne fonctionnant 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 mettant la redirection d'en-tête dans une page php différente 'signin_action.php' et en passant les paramètres de variables que je voulais dans les paramètres d'url, puis en les réaffectant sous la forme 'signin_action.php'.
signin.php
signin_action.php
Ce n'est pas une belle solution, mais cela a fonctionné.
la source
Pour moi, l'erreur est que j'ai essayé de sauvegarder un objet non sérialisable dans la session afin qu'une exception soit levée lors de la tentative d'écriture de la session. Mais comme tout mon code de gestion des erreurs avait déjà cessé toute opération, je n'ai jamais vu l'erreur.
Je pourrais le trouver dans les journaux d'erreurs Apache, cependant.
la source
Juste 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 ... donc si vous rencontrez ce problème, vérifiez que aussi...
la source
www
), donc l'exécutionchown -R www.www
sur le dossier de sessions résout le problème.Pour moi, Firefox a stocké 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 de retour (pour moi: paiement paypal) valide PHPSESSID dans l'url ou le paramètre POST.
la source
Après avoir essayé de nombreuses solutions ici sur SO et d'autres blogs ... ce qui a fonctionné pour moi a été d'ajouter .htaccess à la racine de mon site Web.
la source
Si vous utilisez Wordpress, j'ai dû ajouter ce hook et démarrer la session sur init:
la source
Rien n'a fonctionné pour moi mais j'ai trouvé ce qui a causé le problème (et je l'ai résolu):
Vérifiez les cookies de votre navigateur et assurez-vous qu'il n'y a 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.
la source
Tout d'abord, assurez-vous que vous appelez
session_start()
avant d'utiliser$_SESSION
variable.Si vous avez désactivé le rapport d'erreurs, essayez de l'activer et de voir le résultat.
Les raisons les plus courantes qui ne sont pas mentionnées dans la réponse de @ dayuloli:
Problème d'espace disque. Assurez-vous que votre espace disque n'est pas plein, vous avez besoin d'espace pour stocker les fichiers de session.
Le répertoire de session peut ne pas être accessible en écriture. Vous pouvez le vérifier avec
is_writable(session_save_path())
la source
J'avais le même problème et je suis devenu fou de recherche dans mon code pour la réponse. Enfin, j'ai trouvé que mon hébergement a récemment mis à jour la version PHP sur mon serveur et n'a pas correctement configuré le
session_save_path
paramètre sur lephp.ini
fichier.Donc, si quelqu'un lit ceci, veuillez vérifier la
php.ini
configuration avant toute autre chose.la source
Assurez-vous que
session_write_close
n'est pas appelé entresession_start()
et lorsque vous définissez votre session.la source
Maintenant que le RGPD est une chose, les personnes qui consultent 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 de cookie . Il a une option pour activer les cookies «essentiels». J'ai ajouté
PHPSESSID
à la liste, le script a arrêté de supprimer le cookie et tout a recommencé à fonctionner.Vous pourriez sans doute permettre à un certain paramètre PHP pour éviter d' utiliser
PHPSESSID
, mais si votre script cookie est la cause du problème, pourquoi ne pas fixer que .la source
J'ai résolu ce problème après plusieurs jours de débogage et c'était tout parce que mon URL de retour provenant de PayPal Express Checkout n'avait pas de «www». Chrome a reconnu que les domaines devaient être traités de la même manière, mais d'autres navigateurs ne le faisaient parfois pas. Lorsque vous utilisez des sessions / cookies et des chemins absolus, n'oubliez pas le 'www'!
la source
J'ai corrigé en accordant 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 ().
la source
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 est désactivé):
Cela s'est produit parce que le projet réel fonctionne sur http et pas uniquement sur https. Vous avez trouvé plus d'informations dans la documentation http://php.net/manual/en/session.security.ini.php
la source
Trop tard pour répondre mais cela a fonctionné pour moi
la source
Pour moi, c'était une erreur d'autorisation et cela l'a résolu:
J'ai testé quelques heures sur PHP et le dernier test que j'ai fait est que j'ai créé deux fichiers session1.php et session2.php.
session1.php:
session2.php:
et il imprimait un tableau vide.
À ce stade, je pensais que cela pouvait être un problème de serveur et en fait, c'était le cas.
J'espère que cela aide quelqu'un.
la source