redirect后PHP会话丢失

如何解决在PHPredirect后丢失会话的问题?

最近,我遇到了redirect后丢失会话的一个非常普遍的问题。 而通过search这个网站,我仍然可以find解决办法(尽pipe这是最接近的)。

更新

我find了答案,我想我会在这里发布,以帮助任何人遇到同样的问题。

首先,执行这些常规检查:

  1. 确保session_start(); 在任何会话被调用之前调用。 所以一个安全的select就是把它放在页面的开头,紧接在开始的<?php标签之后。 还要确保在打开<?php标记之前没有空白/标签。
  2. headerredirect后,使用exit();结束当前脚本exit(); (其他人也build议session_write_close();session_regenerate_id(true) ,你也可以尝试这些,但我会使用exit();
  3. 确保在您正在使用的浏览器中启用Cookie以对其进行testing。
  4. 确保register_globals已closures,您可以在php.ini文件中检查并使用phpinfo() 。 请参考如何closures它。
  5. 确保你没有删除或清空会话
  6. 确保$_SESSION超全局数组中的键不被覆盖
  7. 确保你redirect到同一个域。 因此,从www.yourdomain.comredirect到yourdomain.com并不会带来会议进展。
  8. 确保你的文件扩展名是.php (它发生!)

现在,这些是最常见的错误,但是如果他们没有做到这一点,那么这个问题很可能与您的托pipe公司有关。 如果一切工作在localhost但不在远程/testing服务器上,那么这很可能是罪魁祸首。 所以检查您的托pipe服务提供商的知识基础(也尝试他们的论坛等)。 对于像FatCow和iPage这样的公司,他们要求你指定session_save_path 。 所以像这样:

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

(用你的实际的主目录pathreplace“你的主目录path”,这通常在你的控制面板(或者等价的)中,但是你也可以在你的根目录下创build一个test.php文件并input:

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

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

你应该使用header-call之后的“exit”

 header('Location: http://www.example.com/?blabla=blubb'); exit; 

我尝试了所有可能的解决scheme,但没有为我工作! 当然,我正在使用共享托pipe服务。

最后,我通过在redirect标题中使用“相对URL”来解决问题!

 header("location: http://example.com/index.php") 

使会话cookie无效

 header("location: index.php") 

像魅力一样工作!

这难倒了很长一段时间(这个post很好找!),但对于任何人仍然无法获得页面redirect之间的会话工作…我不得不进入php.ini文件,并打开cookie :

 session.use_cookies = 1 

我以为会议没有使用cookies…事实上,我知道他们应该…但这至less解决了我的问题,直到我能够理解可能会在更大的图片上发生。

我在一个特定的页面上遇到了这个问题。 我在其他页面设置$ _SESSION值redirect之前,一切工作正常。 但是这个特定的页面不工作。

最后,我意识到,在这个特定的页面中,我在页面的开始处破坏了会话,但从未再次启动它。 所以我的破坏function从以下变为:

 function sessionKill(){ session_destroy(); } 

至:

 function sessionKill(){ session_destroy(); session_start(); } 

一切正常!

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

在我的情况下,这个问题是由于在Chrome和Firefox中缺lessfavicon.ico而被称为404。 其他的导航员工作正常。

我有类似的问题,虽然我的情况稍有不同。 我有一台主机名为windows ,IP地址为192.168.56.2的机器上的本地开发设置。

我可以使用以下两种方法之一访问系统:

login后,我的PHP代码将redirect使用:

 header('http://windows/'); 

如果以前用于访问系统的域名不是windows ,会话数据将会丢失。 我通过将代码更改为:

 header('http://'.$_SERVER['HTTP_HOST'].'/'); 

无论用户放入什么本地域名或IP地址,它现在都能正常工作。

我希望这可能对某人有用。

我遇到了同样的问题。 突然之间我的一些会话variables不会持续到下一页。 问题原来是(在php7.1)你的标题位置不能有WWW在,如https:// mysite 。 没问题, https://www.mysite 。 将失去该网页会话variables。 不是全部,只是那个页面。

我有同样的问题,并find了最简单的方法。 我只是redirect到一个JS的redirect.html

 <!DOCTYPE html> <html> <script type="text/javascript"> <!-- window.location = "admin_index.php"; //–> </script> </html> 

而不是PHP

 header_remove(); header('Location: admin_login.php'); die; 

我希望这有帮助。

爱克

如果你正在使用session_set_cookie_params()你可能想检查你是否传递第四个参数$secure作为true 。 如果你是,那么你需要使用https访问URL。

$secure参数为true意味着会话只在安全请求中可用。 这在本地可能会比在舞台或生产环境中影响更大。

提起这个问题是因为我今天大部分时间都在试图find这个问题,这就是为我解决了这个问题。 我刚刚添加到这个项目,没有人提到它需要https。

所以你既可以在本地使用https,也可以将$secure参数设置为FALSE ,然后在本地使用http。 只要确保在将更改推送到更新时就将其设置为true。

根据您的本地服务器,您可能需要在服务器的httpd-ssl.conf中编辑DocumentRoot ,以便为您的本地URL提供https服务。

我也有同样的问题redirect不工作,并尝试了所有我能find的解决scheme,我的头redirect正在使用的forms。

我解决了这个问题,把标题redirect到一个不同的php页面'signin_action.php',并通过我想要的urlparameter passingvariables参数,然后在'signin_action.php'表单中重新分配它们。

signin.php

 if($stmt->num_rows>0) { $_SESSION['username'] = $_POST['username']; echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>'; error_reporting(E_ALL); 

signin_action.php

 <?php require('../../config/init.php'); $_SESSION['username'] = $_GET['username']; if ($_SESSION['username']) { echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>'; exit(); } else { echo 'Session not set'; } ?> 

这不是一个美丽的解决办法,但它的工作。

对我来说,错误是我试图在会话中保存一个不可序列化的对象,以便在尝试写入会话时引发exception。 但是,由于我所有的error handling代码已经停止任何操作,我从来没有看到错误。

不过,我可以在Apache错误日志中find它。

只是为了logging…我有这个问题,经过几个小时的尝试一切问题是磁盘已满,php会话无法写入tmp目录…所以如果你有这个问题检查太…

我一直在努力这个好几天,检查/尝试所有的解决scheme,但我的问题是我没有调用session_start(); 再次redirect后。 我只是假设会议“还活着”。

所以不要忘记!

对我而言,Firefox已经将会话ID(PHPSESSID)存储在cookie中,但Google Chrome已经使用GET或POST参数。 所以你只需要确保返回的脚本(对于我:贝宝签出)在url或POST参数中提交PHPSESSID。

在SO和其他博客上尝试了许多解决scheme之后…对我来说,添加.htaccess到我的网站根目录。

 RewriteEngine on RewriteCond %{HTTP_HOST} ^yoursitename.com$ RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L] 

如果你使用Wordpress,我必须添加这个钩子,并在init中启动会话:

 function register_my_session() { if (!session_id()) { session_start(); } } add_action('init', 'register_my_session'); 

另一个可能的原因

这是我的服务器存储空间。 我的服务器磁盘空间已满。 所以,我已经删除了我的服务器中的几个文件和文件夹,并尝试。

这是有效的!

我将会话保存在AWS Dynamo DB中,但仍需要在服务器中处理会话的一些空间。 不知道为什么!

没有为我工作,但我发现是什么原因造成的问题(并解决了):

检查你的浏览器cookies,并确保在不同的子域名上没有php会话cookie (例如“ http://www.website.com ”和“ website.com ”)。

这是由于JavaScript不正确地使用子域来设置cookie和打开iframe中的页面。

确保通过首先销毁旧的会话来正确地创build一个新的会话。

  session_start(); // remove all session variables session_unset(); // destroy the session session_destroy(); session_start(); $_SESSION['username'] = 'username'; 

是的,session_start()被调用两次。 一次调用unset和destroy命令,第二次启动一个新的会话。