PHP Session本地正常CDN部署失效 PHP7.2下Cookie不生效如何解决
PHP 7.2.34环境下Session跨页丢失问题排查修复
问题表现
- 本地localhost环境代码运行正常,部署到线上主机后PHP Session功能异常,带CSRF token校验的表单提交后,page2中
$_SESSION['token']取值为空 - page1表单代码:
<form method='post' action='page2'> <input type='hidden' name='token' value='someRandomToken'> </form>
- page2校验逻辑代码:
if($_SESSION['token'] == $_POST['token']) { // 执行业务逻辑 }
- 已初步排除CDN、主机环境故障,确认问题和PHP 7.2.34版本配置相关,Session、Cookie功能均无法正常使用。
修复方案
按优先级逐一排查以下配置问题:
- 所有依赖Session的页面(page1、page2)必须在任何输出之前调用
session_start()。PHP7.2对输出前置的校验比旧版本更严格,文件BOM头、文件首尾多余空格、提前输出的HTML/echo内容、报错输出都会导致Session无法注册、Cookie无法下发。兜底方案:在项目入口文件最顶部加
ob_start()开启输出缓冲,避免提前输出导致的Session启动失败。 - 修正Session Cookie配置,适配PHP7.2默认参数变更:
PHP7.2新增了Session Cookie的SameSite属性支持,默认配置如果和站点环境不匹配,会直接导致Cookie无法被浏览器携带,在session_start()前添加以下配置:
注意:以上ini配置必须在// 非HTTPS环境设为0,HTTPS环境设为1 ini_set('session.cookie_secure', 0); // 不要设置为Strict,避免页面跳转、表单提交场景下Cookie被拦截 ini_set('session.cookie_samesite', 'Lax'); // 跨子域场景配置为根域名,例如 '.example.com' ini_set('session.cookie_domain', ''); ini_set('session.cookie_path', '/'); // 禁止JS读取Session Cookie,提升安全性 ini_set('session.cookie_httponly', 1); session_start();session_start()调用前设置,否则不会生效 - 检查Session存储目录权限:部分主机环境下PHP默认的系统临时目录无写入权限,会导致Session数据无法落盘,可手动指定站点内可读写目录作为Session存储路径:
// 提前在站点目录下创建session_tmp文件夹,设置权限为755 session_save_path('/var/www/your_site/session_tmp/'); - 对齐本地与线上的
session.auto_start配置:如果本地php.ini开启了session.auto_start = On(自动启动Session),但线上环境关闭了该配置,就会出现本地正常、线上Session丢失的问题。要么统一开启该配置,要么在所有用到Session的页面手动调用session_start()。 - 统一站点访问域名:如果站点存在带www/不带www、HTTP/HTTPS混合访问的情况,会因为域名、协议不一致导致Session Cookie无法跨域携带,建议通过重写规则强制统一访问入口,表单action属性尽量使用绝对路径,避免相对路径解析歧义。
内容的提问来源于stack exchange,提问作者Sam San
相关产品推荐
相关产品推荐

