在PHP中的子域共享会话

Maz*_*med 0 php subdomain session codeigniter

我正在使用CI.我想在子域上共享会话而我正在使用数据库来存储会话

我试过这个

ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));

if(session_id ==''){session_start();}
Run Code Online (Sandbox Code Playgroud)

这意味着xycom和zycom将使用常见的会话帮助我,请

Fra*_*nes 5

考虑到您已经知道自己的域名,是否有理由使用substr来确定它?如果您刚刚使用,您可能会更具可读性:

ini_set('session.cookie_domain', '.domain.tld');
Run Code Online (Sandbox Code Playgroud)

要使cookie跨多个子域工作,cookie域必须以点(.)开头,后跟所有子域的公共部分(很可能是domain.tld).

此外,您的帖子的第二行,您检查是否需要启动会话的那一行是错误的.你在session_id之后缺少一组括号,因为它是一个函数,而不是一个常量.条件语句(if)总是会失败,导致每次都调用session_start().

if ( empty(session_id()) ) session_start();
Run Code Online (Sandbox Code Playgroud)

  • 在配置文件中,添加`$ config ['cookie_domain'] =".domain.tld";`CodeIgniter将为您处理会话.确保将".domain.tld"更改为您的域名(并确保以点开头.) (2认同)

Dav*_*oll 5

在更改其他会话设置和开始新会话之前设置新的session.name.见下面的注释:

//Name your session for changes to be applied to.
session_name('my_session'); //Any arbitrary short name. Must have at least on letter char.

//Force a common cookie domain to apply to all subdomains.
ini_set('session.cookie_domain', '.domain.com'); //Change '.domain.com' accordingly.

//Start the Session if session_id() returns nothing.
if( empty( session_id() ) ) { session_start(); }
Run Code Online (Sandbox Code Playgroud)

这一直对我有用.关于这个的php.net文档很少,但它似乎是社区中许多人的共识.