当使用带主机占位符(如 `{actioncode}.example.com`)的 symfony 路由时,用户仅在该路由页面被意外登出,根本原因是会话 cookie 的 domain 设置未覆盖所有子域名,导致跨子域请求无法共享会话。
在 Symfony 中,启用基于主机的动态路由(例如 host: '{actionCode}.%router.request_context.host%')会使每次请求实际访问不同子域名(如 abc.example.com、xyz.example.com)。而默认的会话 Cookie 配置通常将 cookie_domain 设为精确匹配(如 example.com 或空值),浏览器因此不会在子域名间发送该 Cookie —— 导致服务器端无法识别用户会话,表现为“已登录却突然登出”,且仅发生在该路由匹配的页面。
✅ 正确解决方案是显式配置会话 Cookie 的作用域,使其兼容所有子域名:
# config/packages/framework.yaml
framework:
session:
cookie_domain: '.example.com' # 注意开头的点号:表示匹配 example.com 及所有子域
cookie_lifetime: 0 # 会话级 Cookie(浏览器关闭后失效)
save_path: '%kernel.project_dir%/var/sessions'
name: 'SFSESSID'⚠️ 关键细节说明:
配置生效后,无论用户访问 login.example.com、abc.example.com 还是 xyz.example.com,只要同属 .example.com 域,服务端均可读取并复用同一会话,登录态得以全局保持。