session_start()用于所有子域和localhost

时间:2014-11-02 06:45:57

标签: php session

我使用session_start()函数初始化会话。但会话变量并未在子域之间共享,因此我为example.comwww.example.com设置了不同的会话。所以现在我使用这个自定义功能:

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();
}

它在生产服务器上运行正常,但在localhost上调试时它不起作用。所以我在第一次$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并不存在。通过$_SERVER['REMOTE_ADDR']访问时localhost的值为::1,这似乎与127.0.0.1的ipv6等效,但是当我将|| $_SERVER['REMOTE_ADDR'] == "::1"添加到条件然后设置{{ 1}}到$rootDomain"127.0.0.1"没有任何事情发生。

我还希望它能够在本地IP地址上运行,例如"::1"从同一网络上的其他计算机访问时。

如果192.168.1.100的值不是硬编码的,但是例如来自$rootDomain个变量,那也很好。

是否有办法为所有子域设置相同的会话,这也适用于所有等效的localhost?

1 个答案:

答案 0 :(得分:0)

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

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

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

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