type
Post
status
Published
date
Oct 20, 2016
slug
php-session-bug
summary
和朋友写一个 php 项目, 发现当设置的 session_name 包含
.
的时候,用户的登录状态无法保存了.具体是什么原因导致的呢?tags
PHP
Session
category
技术分享
icon
password
Property
Dec 25, 2022 09:17 AM
在 php 的官方文档中,关于
session_name
设置的问题有如下的描述:会话名称至少需要一个字母,不能全部都使用数字, 否则,每次都会生成一个新的会话 ID
这个似乎和我们的问题没什么关系,而下面有一条这样的描述:
if you try to name a php session “example.com” it gets converted to “example_com” and everything breaks.
他告诉我们
session_name
如果有.
的话,他会将他转换成_
,具体的过程却没有细说.所以我们还需要亲自动手.首先我们设置
session_name
为user.test
,然后输出session_id
,代码如下:session_name('user.test'); session_start(); echo session_id();
不停的刷新页面的话,你会发下你每次输出的
session_id
是不同的.打开 chrome 的开发者工具,查看本地的
cookie
的话,你会发现这样子:cookie
中保存的session_name
依然是user.test
!那么到底是哪里出问题了呢?我们继续找:session_name('user.test'); session_start(); print_r($_COOKIE); echo session_id();
打印出来的结构如图:
问题出现在这里, php 在读取浏览器传过来的
cookie
中的session_name
时,将session_name
中的.
转换成了_
,具体流程如图:至于为什么读取
COOKIE
的时候会将.
_
呢,这就需要我们慢慢研究了.