php 中 session_name 不能有句号的问题

和朋友写一个 php 项目, 发现当设置的 session_name 包含 . 的时候,用户的登录状态无法保存了.具体是什么原因导致的呢?

在 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_nameuser.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的时候会将. _呢,这就需要我们慢慢研究了.

Comments

comments powered by Disqus