You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Laravel与同库子域名下非Laravel PHP应用共享Session?

Laravel与子域名非Laravel PHP应用Session共享实现方案

你当前已经满足同根域名、共用数据库两个核心前提,不需要额外搭建跨域服务,按以下步骤配置即可实现跳转时的用户状态一致:

1. 统一Cookie全局配置

Session是靠Cookie传递ID实现身份识别的,第一步必须让两个应用能读取到同一个Session ID Cookie:

  • Laravel侧修改config/session.php配置:
    • domain设置为根域名,格式为.yourdomain.com(前面带点,兼容所有子域名和旧版浏览器)
    • path设置为/,保证全站路径可访问Cookie
    • cookie统一Cookie名称,建议直接用原生PHP默认的PHPSESSID,减少非Laravel应用的改动量
    • secure、http_only、same_site三个参数记下来,后续非Laravel侧要完全对齐,普通场景下same_site设为Lax即可,存在POST跨子域跳转的场景设为None并开启HTTPS
    • encrypt设为false,否则Laravel会加密Session内容,非Laravel应用无法解密读取
    • 改完执行php artisan config:cache清除配置缓存
  • 非Laravel PHP侧配置:
    没有框架接入的原生应用,在调用session_start()前通过ini_set()设置参数,或直接修改php.ini:
    session.cookie_domain = ".yourdomain.com"
    session.cookie_path = "/"
    session.cookie_httponly = 和Laravel配置一致
    session.cookie_secure = 和Laravel配置一致
    session.cookie_samesite = "Lax" // 和Laravel配置一致
    session.name = "PHPSESSID" // 和Laravel的cookie配置一致
    
    注意必须在所有内容输出前启动Session,否则Cookie无法正常下发。

2. 统一Session存储与读写规则

不要用默认的文件存储(两个应用的Session文件默认路径不一致,就算ID相同也读不到内容),直接复用现有共用数据库做Session存储:

  • Laravel侧切换驱动为数据库:
    执行命令生成Session表并执行迁移:
    php artisan session:table
    php artisan migrate
    
    然后修改config/session.php的driver为database即可。
  • 非Laravel侧实现兼容的数据库Session Handler:
    Laravel生成的Session表结构固定为id(varchar 128)、user_id(可空)、ip_address、user_agent、payload(longtext)、last_activity(int),非Laravel侧实现自定义Session读写逻辑时注意格式对齐:
    • 读逻辑:拿到Session ID后查对应记录,取payload字段先做base64_decode,再用unserialize()解析成数组即可拿到Session内容
    • 写逻辑:把要存的Session数组用serialize()序列化后再做base64_encode存入payload字段,last_activity字段存当前time()时间戳即可
    • 垃圾回收:直接按last_activity字段清理超过有效期的记录即可,和Laravel的过期逻辑完全对齐。

3. 登录态同步与校验

配置完成后做三步验证,避免跳转丢状态:

  • 先验证Cookie传递:在两个应用分别打印Cookie列表,确认能拿到同名、同值的Session ID,没有被浏览器拦截
  • 再验证Session读写:在Laravel中存入测试值session(['test_shared' => 123]),跳转到非Laravel应用打印$_SESSION['test_shared'],能拿到值说明Laravel写入、非Laravel读取正常;反向写入测试同理
  • 最后对齐登录态字段:两个应用共用同一套用户表的前提下,统一在Session中存储用户ID的字段名(比如都叫auth_uid),Laravel侧可以自定义Auth Guard,直接从Session读取该字段查询用户表完成登录校验,不需要兼容Laravel默认的用户序列化格式,减少适配成本。

常见踩坑点

  • 不要混用序列化格式:如果非Laravel应用用json_encode存储Session内容,Laravel侧也要对应修改读写逻辑,一边用PHP序列化、一边用JSON会直接读取出错
  • Cookie的Secure参数必须一致:如果一个站点开HTTPS一个没开,secure设为true时HTTP站点完全拿不到Cookie,建议全站统一开HTTPS后再开启该配置
  • Session ID长度要留足:数据库的id字段长度至少设为128位,避免PHP高版本开启长Session ID时写入失败

内容的提问来源于stack exchange,提问作者victor ukafor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:06:09