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

PHP使用window.location跳转后Session丢失,本地正常服务器端失效

问题描述

我想通过Javascript的window.location跳转到另一个PHP文件时保留Session,但在服务器上运行时Session总是丢失,本地环境运行正常。服务器使用IP地址访问,示例地址为 http://1.1.1.1/app/check_session.php ,操作系统为CentOS,项目根路径为/app,请问是否是路径导致的问题?

更新

  • 跳转到check_session_submit.php后session_id()发生变化(跳转前 > 跳转后),甚至刷新check_session.php页面时session_id也会持续变化

相关代码

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);
?>

已尝试的解决方案

参考相关技术回答操作未解决问题:

  1. 尝试将Session存储路径设置为.../app/cgi-bin/tmp,并执行chmod 777赋予目录权限,仍无法存储Session
  2. 查看/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:45:04