2014-11-02 38 views
0

我已经使用session_start()函数初始化会话。但会话变量不是跨子域共享的,所以我有example.comwww.example.com的不同会话。所以,现在我使用这个自定义函数:session_start()对于所有子域和本地主机

function my_session_start() { 
    $currentCookieParams = session_get_cookie_params(); 
    $rootDomain = ".example.com"; 
    session_set_cookie_params(
     $currentCookieParams["lifetime"], 
     $currentCookieParams["path"], 
     $rootDomain, 
     $currentCookieParams["secure"], 
     $currentCookieParams["httponly"] 
    ); 
    session_name("project_name_session"); 
    session_start(); 
} 

它工作正常,在生产服务器上,但在本地主机上调试时它不工作。所以我说第一$rootDomain声明后,这些线路:

if($_SERVER['REMOTE_ADDR'] == "127.0.0.1") { 
    $rootDomain = "127.0.0.1"; 
} 

现在,当我访问http://127.0.0.1/project_direcotory工作。但是,当我访问http://localhost/project_direcotory ID不。当通过localhost访问时,$_SERVER['REMOTE_ADDR']的值为::1,这看起来像127.0.0.1的ipv6等价物,但是当我向条件添加|| $_SERVER['REMOTE_ADDR'] == "::1",然后将$rootDomain设置为"127.0.0.1""::1"时,什么都不会发生。

我也想,如果它也适用于本地IP地址,如192.168.1.100从同一网络上的其他机器访问时。

如果$rootDomain的值没有硬编码,但是例如从$_SERVER变量派生出来,这也会很好。

是否有一种方法可以让所有子域具有相同的会话,这也适用于本地主机的所有等价物?

+0

看一看:ini_set('session.cookie_domain','。'。yourdomain);记住点,所以你的会话也可以看到所有子域。不知道这是否足够,但值得看看:)。 BR。 – 2014-11-02 07:00:30

回答

0

您可以调用session_set_cookie_params()之前设置一个会话名称:

$some_name = session_name("some_name"); 
session_set_cookie_params(0, '/', '.some_domain.com'); 
session_start(); 

OR

假设你有一个init文件,您包括在每个PHP页面的顶部,您可以使用ini_set()函数。只需将其添加到首页的顶部即可:

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