重定向后PHP会话丢失

day*_*oli 122 php session redirect shared-hosting session-cookies

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

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

更新

我找到了答案,我想我会在这里发布,以帮助遇到同样问题的人.

day*_*oli 186

首先,执行以下常规检查:

  1. 确保session_start();在调用任何会话之前调用.所以一个安全的赌注就是把它放在你的页面的开头,紧接在开放<?php声明之后的任何其他事情.还要确保在打开<?php声明之前没有空格/制表符.
  2. 在后header重定向,使用结束当前的脚本exit();(其他人也建议session_write_close();,并session_regenerate_id(true),你可以尝试那些为好,但我会用exit();)
  3. 确保在您用于测试的浏览器中启用了cookie.
  4. 确保register_globals关闭,您可以在php.ini文件上检查并使用phpinfo().请参阅关于如何将其关闭.
  5. 确保您没有删除或清空会话
  6. 确保$_SESSION超级全局数组中的键不会被覆盖
  7. 确保您重定向到同一个域.所以从a重定向www.yourdomain.comyourdomain.com不会进行会话.
  8. 确保你的文件扩展名是.php(它发生!)

现在,这些是最常见的错误,但如果他们没有做到这一点,问题很可能与您的托管公司有关.如果一切正常,localhost但远程/测试服务器上没有,那么这很可能是罪魁祸首.因此,请检查您的托管服务提供商的知识库(也尝试他们的论坛等).对于像FatCow和iPage这样的公司,他们要求您指定session_save_path.像这样:

session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();
Run Code Online (Sandbox Code Playgroud)

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

<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
Run Code Online (Sandbox Code Playgroud)

'test.php'之前的位是您的主目录路径.当然,请确保该文件夹实际存在于根目录中.(某些程序在同步时不上传空文件夹)

  • 非常好的写入+1,如果全部失败,只需使用cookie(随机生成一个字符串并将其存储在数据库中并将其用作您的cookie值). (7认同)
  • 请注意,截至php 5.4.0 register_globals已被删除,因此它将不再导致问题 (4认同)
  • 在http和http https之间切换可能也是一个问题http://stackoverflow.com/questions/441496/session-lost-when-switching-from-http-to-https-in-php (2认同)
  • 检查Web服务器错误日志; 在我的情况下,出现错误"无法写入会话数据(文件).请验证session.save_path的当前设置是否正确".save_path目录上的权限是错误的. (2认同)

小智 22

你应该在标题调用后使用"exit"

header('Location: http://www.example.com/?blabla=blubb');
exit;
Run Code Online (Sandbox Code Playgroud)


小智 13

我尝试了所有可能的解决方案,但没有一个适合我!当然,我正在使用共享托管服务.

最后,我通过在重定向头中使用'relative url'解决了这个问题!

header("location: http://example.com/index.php")
Run Code Online (Sandbox Code Playgroud)

使会话cookie无效

header("location: index.php")
Run Code Online (Sandbox Code Playgroud)

像魅力一样工作!


小智 6

我有同样的问题。我工作了几个小时,这让我发疯。

就我而言,问题是由于仅在Chrome和Firefox中缺少favicon.ico而调用了404 。其他导航器工作正常。


小智 5

我遇到了同样的问题。突然之间,我的一些会话变量不会持续到下一页。问题原来是(在 php7.1 中)您的标题位置中不能包含 WWW,例如https://mysite。没问题,https://www.mysite。将丢失该页面会话变量。不是全部,只是那一页。


小智 5

当我在 header() 函数中使用相对路径“dir/file.php”时对我有用。我认为当您使用完整的 url 重定向时,由于某种原因没有保存会话......

//Does retain the session info for some reason
header("Location: dir");

//Does not retain the session for some reason
header("Location: https://mywebz.com/dir")
Run Code Online (Sandbox Code Playgroud)