我使用session_start()
函数初始化会话。但会话变量并未在子域之间共享,因此我为example.com
和www.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?
答案 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));