redirect后PHP会话丢失
如何解决在PHPredirect后丢失会话的问题?
最近,我遇到了redirect后丢失会话的一个非常普遍的问题。 而通过search这个网站,我仍然可以find解决办法(尽pipe这是最接近的)。
更新
我find了答案,我想我会在这里发布,以帮助任何人遇到同样的问题。
首先,执行这些常规检查:
- 确保
session_start();
在任何会话被调用之前调用。 所以一个安全的select就是把它放在页面的开头,紧接在开始的<?php
标签之后。 还要确保在打开<?php
标记之前没有空白/标签。 -
header
redirect后,使用exit();
结束当前脚本exit();
(其他人也build议session_write_close();
和session_regenerate_id(true)
,你也可以尝试这些,但我会使用exit();
) - 确保在您正在使用的浏览器中启用Cookie以对其进行testing。
- 确保
register_globals
已closures,您可以在php.ini
文件中检查并使用phpinfo()
。 请参考如何closures它。 - 确保你没有删除或清空会话
- 确保
$_SESSION
超全局数组中的键不被覆盖 - 确保你redirect到同一个域。 因此,从
www.yourdomain.com
redirect到yourdomain.com
并不会带来会议进展。 - 确保你的文件扩展名是
.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
的机器上的本地开发设置。
我可以使用以下两种方法之一访问系统:
- HTTP://本地主机/
- http://127.0.0.1/
- HTTP://窗/
- http://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命令,第二次启动一个新的会话。