
当使用带主机占位符(如 `{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'⚠️ 关键细节说明:
- cookie_domain 必须以 . 开头(如 .example.com),这是浏览器识别“通配子域”的标准语法;写成 example.com 或 www.example.com 将无法匹配 abc.example.com;
- 确保 %router.request_context.host% 解析出的基准域名(如 example.com)与 cookie_domain 值一致,否则子域派生无效;
- 若部署在本地开发环境(如 localhost),注意:现代浏览器禁止为 localhost 设置带点的 domain(如 .localhost),此时应改用 127.0.0.1 + hosts 绑定真实域名(如 app.localhost)进行测试;
- 清除浏览器中旧的、domain 不匹配的会话 Cookie 后再测试,避免缓存干扰。
配置生效后,无论用户访问 login.example.com、abc.example.com 还是 xyz.example.com,只要同属 .example.com 域,服务端均可读取并复用同一会话,登录态得以全局保持。











