Apache别名站点共享PHP会话问题及解决方法咨询
问题描述
在Ubuntu 22.04上部署了Apache2、PHP和MySQL,创建了两个内部站点:主站为https://web.domain.cz,另一个是同虚拟主机下的别名站点https://web.domain.cz/second(作为主站的管理后台)。以下是vhost配置:
<VirtualHost *:443> ServerName web.domain.cz DocumentRoot /var/www/web SSLEngine on SSLCertificateFile /etc/ssl/certs/xxx.pem SSLCertificateKeyFile /etc/ssl/private/xxx.key <Directory /var/www/web> Require all granted </Directory> <Files dbh.php> Require all denied </Files> Alias /second /var/www/second <Directory /var/www/second> Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerName web.domain.cz Redirect / https://web.domain.cz/ </VirtualHost>
遇到的问题:当在其中一个站点执行session_destroy();登出时,另一个站点也会同步登出;修改同一个会话变量时,两个站点的变量也会同步(例如存储的排序顺序,在一个站点修改后另一个也会改变)。请问为何会话变量会共享,该如何解决?(未使用任何PHP框架)
原因分析
这两个站点属于同一域名下的不同路径,PHP默认会将会话Cookie绑定到整个域名(默认session.cookie_domain为空,自动适配当前域名),因此两者共用同一个会话ID,自然会共享会话数据。
解决方法
要让两个路径的会话独立,需为它们设置不同的会话Cookie路径或会话名称,可通过以下两种方式实现:
方法一:在代码中单独配置会话参数
在两个站点的入口文件(如主站index.php、后台second/index.php)开头添加代码,指定独立的会话配置:
- 主站代码:
session_set_cookie_params([ 'path' => '/', 'name' => 'MAIN_SESSION' ]); session_start();
- 后台站点代码:
session_set_cookie_params([ 'path' => '/second', 'name' => 'ADMIN_SESSION' ]); session_start();
说明:
- 设置
path后,会话Cookie仅在对应路径下生效,两个站点的会话ID不会互相干扰; - 设置不同的
name,即使路径相同,会话Cookie名称不同,也会存储独立的会话数据。
方法二:通过Apache配置为不同路径设置PHP参数
在vhost的目录配置块中添加PHP会话参数,让不同路径下的PHP使用独立会话配置:
修改vhost中的<Directory /var/www/second>块:
<Directory /var/www/second> Require all granted php_value session.cookie_path "/second" php_value session.name "ADMIN_SESSION" </Directory>
主站如需保持独立配置,可在<Directory /var/www/web>中添加:
<Directory /var/www/web> Require all granted php_value session.cookie_path "/" php_value session.name "MAIN_SESSION" </Directory>
修改完成后重启Apache服务生效:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者SheldonCopper
相关产品推荐
相关产品推荐

