如何解决在PHP中重定向后丢失会话的问题?

最近,我遇到了一个非常常见的重定向后丢失会话的问题.在搜索这个网站后,我仍然没有找到任何解决方案(虽然this个最接近).

Update

我已经找到了答案,我想我应该把它张贴在这里,以帮助任何遇到同样问题的人.

推荐答案

首先,进行以下常规判断:

  1. 在调用任何会话之前,确保已调用session_start();.因此,一个安全的 Select 是把它放在页面的开头,紧接着在<?php开头声明之后,然后再做其他事情.还要确保在开始<?php声明之前没有空格/制表符.
  2. header重定向之后,使用exit();结束当前脚本(其他人也建议使用session_write_close();session_regenerate_id(true),您也可以try ,但我会使用exit();)
  3. 确保在用于测试cookie的浏览器中启用了cookie.
  4. 确保register_globals处于关闭状态,您可以在php.ini文件中判断这一点,也可以使用phpinfo().关于如何关闭,请参阅this.
  5. 确保没有删除或清空会话
  6. 确保$_SESSION superglobal数组中的键没有被覆盖
  7. 确保您重定向到相同的域.所以从www.yourdomain.com重定向到yourdomain.com不会继续会话.
  8. 确保您的文件扩展名为.php(确实如此!)

现在,这些是最常见的错误,但如果他们没有做到这一点,问题很可能与你的托管公司有关.如果所有东西都在localhost上工作,但在远程/测试服务器上不工作,那么这很可能就是罪魁祸首.因此,请查看你的主机Provider 的知识库(也可以try 他们的论坛等).对于FatCow和iPage这样的公司,他们要求您指定session_save_path.就像这样:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();

(将"您的主目录路径"替换为您的实际主目录路径.这通常位于您的控制面板(或等效工具)内,但您也可以在根目录上创建一个test.php文件,并键入:

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>

"测试前的一点".php'是您的主目录路径.当然,还要确保该文件夹确实存在于根目录中.(某些程序在同步时不上载空文件夹)

Php相关问答推荐

PHP邮件表单无法识别重音/特殊字符

在PHP 8.2 Gloogle云引擎上加载大型php文件速度缓慢

如何在微软图形API中使用用户S访问令牌或基于租户ID的访问令牌?

上传WordPress模板中的翻译文件(.mo和.po)

如何使用定制的StateProvider设置JsonLd@上下文?

如何在laravel中添加延迟?

curl_close()未从PHP 8开始写入CURLOPT_COOKIEJAR会话文件

Docker-用于部署的 PHP 应用程序映像无法在本地运行

调度程序不发送任何消息

后退按钮不起作用 laravel ajax crud

使用 PHP 的 OAuth 2.0 MAC

根据WooCommerce中的产品重量更改简单产品的输入数量步值

为 WordPress 页面创建新功能

使用来自 PHP 表单的数据更新 xml 命名空间

按前 3 列对二维数组中的行数据进行分组,然后用逗号连接每组中的其余列

每个发布请求 Laravel 9 的 CSRF 令牌不匹配

为什么 AJAX 请求没有通过 is_ajax_request() codeigniter 的条件?

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

Php 的新WeakMap - 枚举曾经被垃圾收集过吗?

如果 static:: 被解析为B,为什么 PHP 会执行A的方法