MISE À JOUR DU PROBLÈME:
setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/', 'www.mywebsite.com');
mais cela échoue.setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/');
entraîne la suppression de PHPSESSID que j'ai défini.session_name
pour renommer la SESSION que j'ai définie. Cela fonctionne, mais mon serveur s'est écrasé plusieurs fois après quelques minutes.Je travaille avec PHP sessions sur mon site Web.
Le chemin de la session était/dossier, plus tard j'ai changé pour/pour s'adapter au nouvel objectif.
Maintenant, les anciens utilisateurs ne peuvent pas se connecter.
Il semble qu'ils aient maintenant deux PHPSESSID stockés dans leurs navigateurs - l'un avec chemin/dossier et l'autre /.
Que puis-je faire pour que les anciens utilisateurs puissent se connecter tout en veillant à ce que la session soit sur l'ensemble du site avec "/".
Plus d'informations
Quand j'ai dit deux phpsessionid, reportez-vous à l'image
A. session_set_cookie_params(864000, '/cv', '.website.com', 0, 1);
mais ne fonctionne pas si j'utilise:
B. session_set_cookie_params(864000, '/', '.website.com', 0, 1);
MISE À JOUR SUR LA SUPPRESSION DE PHPSESSID AVEC JAVASCRIPT
MISE À JOUR DE LA SUPPRESSION DE PHPSESSID AVEC PHP
var_dump($_COOKIE['PHPSESSID']);
ce qui est retourné est la valeur de PHPSESSID avec le chemin/cvsetcookie ("PHPSESSID", "", time() - 3600);
échoue.Je pense que vous mélangez les choses ou que vous devriez aller plus en détail sur votre configuration/problème.
Le chemin de session de PHP est l'emplacement où les données de session sont stockées sur votre serveur, pas le client. Voir la documentation: https://secure.php.net/manual/fr/session.configuration.php#ini.session.save-path
Vous pouvez déplacer ces fichiers et remplacer/conserver en cas de collision comment bon vous semble. Cela n’est quasiment limité que par les permissions de lecture/écriture que vous avez lors de l’accès/déplacement et que votre utilisateur de serveur Web (par exemple Apache ou nginx) ou php-utilisateur dispose pour les lire/écrire à partir du/vers le nouvel emplacement.
Si par "PHPSESSID dans leur navigateur" vous voulez dire que l'identifiant de session fait partie de vos urls, c'est-à-dire un paramètre différent de PHP, qui devrait être désactivé de toute façon, voir la notice dans la documentation: https://secure.php.net /manual/en/session.configuration.php#ini.session.use-trans-sid
modifier en fonction de votre question mise à jour:
Il existe déjà une solution Nice JS permettant de supprimer l'ancien cookie. J'irais avec ça. si vous ne pouvez pas simplement faire cela, vous pouvez faire une redirection vers /cv
avec un script php qui lit le cookie et stocke les données quelque part (une base de données basée par exemple sur le user_id) et expire le cookie. Ensuite, vous pouvez rediriger vers l’ancienne page, rechercher le cookie "/" et restaurer les données. C'est un hack très moche, mais je ne pense pas que vous puissiez obtenir le cookie pour chaque chemin en PHP, car il est côté serveur et basé sur l'identifiant de session fourni par le client (mais je me trompe peut-être).
Je voudrais simplement expirer le cookie de /folder
. Cela devrait vous laisser avec un seul cookie de session pour /
setcookie('PHPSESSID', '', time() - 86400, '/folder/');
Vous pouvez modifier le nom du cookie de votre nouvelle session en utilisant session_name () avant session_start () et laisser le problème se résoudre tout seul dans quelques jours.
session_name("SESSION_ID");
session_start();
Vous devez supprimer un cookie côté client. C'est possible avec javascript.
Essayez ce javascript sur votre site:
<script type="text/javascript">
document.cookie = "PHPSESSID=;Path=/cv;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
</script>
Un exemple:
Pour cet exemple, utilisez le site https://developer.mozilla.org/en-US/ .
Si je charge ce site sur les cookies, il y a les entrées suivantes Maintenant, je veux supprimer le cookie avec le nom dwf_section_edit
. Pour supprimer ce cookie, je règle la date d'expiration sur le passé. Après que j'exécute
document.cookie = "dwf_section_edit=;Path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
sur la console, le cookie est absent comme vous pouvez le voir sur l'image suivante (j'ai utilisé le petit bouton de rafraîchissement en bas à gauche du tableau car il n'est que temporaire dans cet exemple)
Lors du prochain rechargement, je récupère le cookie dans cet exemple, car Mozilla me le rend. Sur votre site, vous n'avez pas à créer l'ancien cookie à nouveau et tout va bien.
J'imagine que votre script ne sait pas quelle session doit être accédée lors de session_start ();
Essayez de spécifier le chemin correct pour la session en utilisant
ini_set('session.cookie_path', '/');
ou
session_start(['cookie_path' => '/']);
en fonction de votre configuration
Si cela ne vous aide pas, je suggérerais d'utiliser session_regenerate_id () qui remplacera l'identifiant de session actuel par un nouvel identifiant et conservera les informations de la session actuelle.
Si vous envoyez manuellement l'en-tête avec la nouvelle date d'expiration pour le chemin souhaité, le client doit le supprimer.
session_start();
header("Set-Cookie:PHPSESSID=".session_id()."; expires=Sat, 07-Nov-1999 14:58:07 GMT; path=/cv/");
La première fois, vous avez l'ancien chemin du cookie, mais à partir de la deuxième page, seul le cookie dans le chemin /
sera stocké et transmis.
Vous pouvez envoyer cet en-tête lorsque vous savez si le client est concerné par ce problème ou si cela dure quelques mois.
Il est mentionné ici , bien que l'utilisation de session_register () soit déconseillée et que l'utilisation de $ _SESSION soit préférée: -
Si session_start () n'a pas été appelé avant cette fonction, un appel implicite à session_start () sans paramètre sera effectué. $ _SESSION ne reproduit pas ce comportement et nécessite session_start () avant utilisation.
Puis, en utilisant $ _SESSION, ajoutez un fichier JSON avec Auth = True, avec TimeOut = 20 minutes.
Lorsque l'utilisateur se déconnecte ou après l'expiration du délai, définissez Auth = False . Lisez ensuite ce fichier JSON à l'aide de PHP et
Ensuite, si Auth = False, créez JS en utilisant PHP cet événement OnLoad, document.cookie = 'PHPSESSID' + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
Vous pouvez le supprimer en le définissant avec une heure précédente pour qu'il expire:
setcookie('phpsessid','value',time()-1);
La solution sera de laisser les utilisateurs accéder au dossier / folder pendant la durée d’expiration de la session. Sur ce chemin, créez un script php pour copier ALL COOKIES de / dossier à / chemin en utilisant setcookie function ( http://php.net/manual /ro/function.setcookie.php )
foreach ($_COOKIE as $key => $value) {
setcookie($key, $value, $expire, "/")
}
// redirect to "/" now. User will be able to login.
Explication supplémentaire: les cookies sont liés à chemin et domaine, c'est important (et par défaut c'est /, mais il semble que ce ne soit pas votre cas). Donc, PHPSESSID depuis le sous-chemin (comme/folder ou/me) n'est pas accessible depuis le parent. Et ils se propagent de parent en enfant. Ainsi, les cookies de / moi sont les mêmes que pour / avec aucun attribut explicite.
Fournissez simplement le 4ème argument lorsque vous appelez la fonction setcookie
:
setcookie ("PHPSESSID", "", time() - 3600, '/');
Explication
Le 4ème argument de la fonction
setcookie()
est$path
de la session à définir. Et pour cela, "La valeur par défaut est le répertoire actuel dans lequel le cookie est défini.". (Voir: http://php.net/manual/en/function.setcookie.php .) Donc, si vous appelez cette fonction à partir d'un fichier localisant le dossier "/ folder", il essa cookie de ce dossier uniquement. En définissant le$path
sur "/", nous demandons à la fonction de supprimer l'id de session du répertoire racine.
Je l'ai testé et il a supprimé la variable PHPSESSID
du cookie avec succès.
Oui, vous devez définir une durée négative pour le cookie afin que le navigateur puisse le supprimer. En outre, nous définissons la valeur stockée sur une chaîne vide, ce qui permet également de supprimer le même cookie ...
Ceci (en haut de votre page) conviendrait, assurez-vous juste de session_start()
en premier:
setcookie('PHPSESSID', '', -3600, '/cv');
Cela fonctionne parfaitement sur tous mes domaines, j'ai eu ce problème une fois.