PHP子域间Session不共享排查:部分子域Session ID不同
以下是可能导致部分子域无法共享Session的具体原因及排查方向:
Cookie路径限制
虽然统一设置了session.cookie_domain = ".my_domain_name",但如果部分子域的代码中修改了session.cookie_path(比如设置为/admin这类特定目录),其他不在该路径下的子域页面将无法读取对应Cookie。检查所有子域的配置,确保session.cookie_path统一设为/。HTTPS与HTTP混合访问
若部分子域用HTTPS、部分用HTTP,且HTTPS子域开启了session.cookie_secure = true,则HTTP子域无法获取带Secure属性的Cookie。需统一配置:存在HTTP子域时关闭cookie_secure;全量HTTPS时统一开启该属性。SameSite属性冲突
不同子域的session.cookie_samesite设置不一致(比如部分设为Strict、部分设为Lax),会触发浏览器的跨域Cookie限制。跨子域共享建议统一设为Lax;若需跨站请求携带,设为None时必须同时开启Secure。Session存储不统一
若子域部署在不同服务器,且部分用本地文件存储Session、部分用Redis等共享存储,即便Cookie传递正常,服务器端也无法匹配到对应Session数据。确保所有子域使用完全一致的Session存储配置(如统一用Redis)。子域层级不匹配
确认所有子域都属于my_domain_name的有效层级,比如a.my_domain_name、b.my_domain_name是合法的,但如果存在类似a.other_domain.com这类跨主域的情况,.my_domain_name的Cookie规则无法覆盖。代码执行顺序错误
部分子域可能在session_start()之前有输出(比如echo、空白字符、提前输出的HTML标签),导致Session Cookie无法正确写入。检查这些子域的代码,确保session_start()是第一个执行的输出相关操作。浏览器缓存残留
部分子域可能遗留了旧的Session Cookie,浏览器优先读取缓存的旧ID。测试时可使用隐私模式,或手动清除浏览器Cookie后重试。
内容的提问来源于stack exchange,提问作者Ahmed Malik

