PHP使用window.location跳转后Session丢失,本地正常服务器端失效
我想通过Javascript的window.location跳转到另一个PHP文件时保留Session,但在服务器上运行时Session总是丢失,本地环境运行正常。服务器使用IP地址访问,示例地址为 http://1.1.1.1/app/check_session.php ,操作系统为CentOS,项目根路径为/app,请问是否是路径导致的问题?
更新
相关代码
check_session.php
<?php session_start(); echo "Session Path: ".session_save_path()."<br>"; echo "Session ID: ".session_id()."<br>"; $_SESSION["test"] = "test"; ?> <html> <head> <script> function delayer(){ window.location = "check_session_submit.php"; exit(); } </script> </head> <?php if(isset($_POST["field_1"])){ $_SESSION["field_1"] = $_POST["field_1"]; ?> <body onLoad="setTimeout('delayer()', 1)"> <?php } ?> <form method="POST"> <input type="text" name="field_1"> <input type="submit"> </form> </body> </html>
check_session_submit.php
<?php session_start(); echo "Session Path: ".session_save_path()."<br>"; echo "Session ID: ".session_id()."<br>"; echo "Session Data: ".json_encode($_SESSION); ?>
已尝试的解决方案
参考相关技术回答操作未解决问题:
- 尝试将Session存储路径设置为
.../app/cgi-bin/tmp,并执行chmod 777赋予目录权限,仍无法存储Session - 查看
/var/log/httpd/error_log路径下的Apache错误日志无报错
服务器Session配置
session.save_path = "/tmp" session.save_handler = files session.use_strict_mode = 0 session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.serialize_handler = PHP session.gc_maxlifetime = 1440 session.gc_divisor = 1000 session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.sid_length = 26 session.trans_sid_tags = "a=href,area=href,frame=src,form=" session.sid_bits_per_character = 5
服务器响应的HTTP头信息见:server response HTTP header
1. 校验Session存储目录权限
CentOS默认Apache运行用户为apache,首先执行ls -ld /tmp检查目录权限,正常应显示为drwxrwxrwt,必须带有sticky位。如果权限不符,执行chmod 1777 /tmp修复。
访问一次页面后查看/tmp目录下是否生成sess_前缀的Session文件,文件所属用户应为apache,如果没有生成文件则确认是写入权限问题。
2. 排查PHPSESSID Cookie存储异常
刷新页面就生成新SessionID的核心原因通常是浏览器没有正确存储PHPSESSID Cookie:
- 打开浏览器开发者工具的「应用/存储」标签,检查对应IP域名下是否存在PHPSESSID Cookie
- 如果响应头返回了
Set-Cookie: PHPSESSID=xxx但浏览器没有存储,重点检查Cookie的Secure属性:如果你的站点是HTTP访问(IP访问默认走HTTP),但Cookie设置了Secure属性,浏览器会拒绝存储该Cookie,因为Secure属性要求Cookie必须通过HTTPS协议传输。
3. 检查Web服务器额外配置
确认Apache的主配置httpd.conf、站点虚拟主机配置、站点根目录下的.htaccess文件中,是否有覆盖Session参数的配置,比如php_value session.cookie_secure 1这类强制开启Secure属性的配置,本地环境无此配置所以运行正常。
4. 排查中间件拦截问题
如果服务器前部署了CDN、WAF、反向代理等中间件,检查是否有过滤Set-Cookie响应头、或者缓存了无Cookie的响应内容,导致每次请求都生成新的Session。
5. 固定SessionID验证问题根因
在两个PHP文件的session_start()前添加代码session_id('test123456');强制固定SessionID,刷新页面后如果SessionID不再变化且能读到Session内容,即可确认问题出在Cookie存储环节,再针对性排查即可。
内容的提问来源于stack exchange,提问作者tri samsul

