如何在PHP重定向后解决丢失会话的问题?
最近,我遇到了一个非常普遍的问题:重定向后会话丢失。即使在这个网站上搜索,我仍然找不到解决方案(尽管这个已经接近了答案)。
更新
我已经找到了答案,并且想在这里发布它,以帮助任何遇到同样问题的人。
如何在PHP重定向后解决丢失会话的问题?
最近,我遇到了一个非常普遍的问题:重定向后会话丢失。即使在这个网站上搜索,我仍然找不到解决方案(尽管这个已经接近了答案)。
更新
我已经找到了答案,并且想在这里发布它,以帮助任何遇到同样问题的人。
首先,进行以下常规检查:
session_start();
。因此,最安全的方法是将它放在页面开头,在任何其他内容之前,在打开的 <?php
声明后立即使用。也请确保在 <?php
声明前没有空格或制表符。exit();
结束当前脚本(其他人还建议使用 session_write_close();
和 session_regenerate_id(true)
,您也可以尝试这些,但我会使用 exit();
)register_globals
,您可以在 php.ini
文件和使用 phpinfo()
中检查此设置。参考此处以了解如何关闭该设置。$_SESSION
超级全局数组中的键未被覆盖。www.yourdomain.com
重定向到 yourdomain.com
不会将会话转发。.php
(这种错误很常见!)这些是最常见的错误,但如果它们没有解决问题,问题很可能与您的托管公司有关。如果在本地主机上一切正常,但在远程/测试服务器上不正常,则很可能是此原因。因此,请检查您托管服务提供商的知识库(也可以尝试其论坛等)。像 FatCow 和 iPage 这样的公司需要您指定 session_save_path
。例如:
session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();
(用您实际的家目录路径替换“your home directory path”。这通常在您的控制面板(或等效物)内,但您也可以在根目录下创建一个test.php
文件并键入以下内容:
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
'test.php' 前面的部分是您的主目录路径。当然,确保该文件夹实际存在于您的根目录中。 (某些程序在同步时不会上传空文件夹)
www.yourdomain.com
重定向到yourdomain.com
不会将会话继续传递。☚解决了我的问题。 - TheTechGuy在调用头部后,您应该使用 "exit"。
header('Location: http://www.example.com/?blabla=blubb');
exit;
echo'';
)或任何空格,则会完全忽略位置标头。 - John我尝试了所有可能的解决方案,但都没有成功!当然,我正在使用共享托管服务。
最后,我通过在重定向头中使用“相对URL”来解决了这个问题!
header("location: http://example.com/index.php")
使会话Cookie失效
header("location: index.php")
运作得非常好!
我遇到了同样的问题。我花了几个小时来解决它,这让我感到疯狂。
在我的情况下,Chrome和Firefox浏览器中因为缺少favicon.ico而出现了404错误。其他浏览器则没问题。
我曾遇到过同样的问题。突然之间,我的一些会话变量无法持续到下一页。问题在于(在 PHP7.1 中)您的头部位置不能带有WWW,例如https://mysite可以,https://www.mysite会丢失该页面的会话变量。不是所有页面都会丢失,只有那一页会。
www.mysite.com
被视为与blog.mysite.com
或仅仅的mysite.com
完全不同的域名。 - dayuloli//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")
windows
,IP地址为 192.168.56.2
。header('http://windows/');
windows
,会导致会话数据丢失。我通过更改代码解决了这个问题:header('http://'.$_SERVER['HTTP_HOST'].'/');
function sessionKill(){
session_destroy();
}
to:
function sessionKill(){
session_destroy();
session_start();
}
一切都正常工作了!
我为此苦恼了好几天,查看/尝试了所有的解决方案,但我的问题在于重定向后我没有再次调用session_start();
。 我只是假设会话仍然“存活”。
所以不要忘记这个细节!
session.use_cookies = 1
我原本认为会话可以在没有cookie的情况下运行...事实上,我知道它们应该可以...但是这至少解决了我的问题,直到我能够理解更大的背景。