我正在从登录页面设置会话变量($ _SESSION ['login'])。我已经彻底测试过,变量肯定是在创建并且存储了正确的值($ _SESSION ['login'] ='1'),但使用Chrome,Opera或Firefox在下一页中无法识别变量 - 奇怪的是,相同的脚本在Safari和Internet Explorer中的工作方式正常。
任何帮助都会非常感激 - 我一直在努力想出这个问题一段时间而且无法得到它 - 我在这里完全失去了。
这是一步一步 -
<?php
// log in page
// if logged in successfully set the session variable
session_start();
if (// log in credentials good) {
$_SESSION['login'] = '1';
header('location:inside_page.php');
// echo $_SESSION['login'] ;
// ----------------------
// commenting out the redirect and echoing
// the session variable works as expected
// in IE, Safari, Chrome, Opera and Firefox
}
?>
这是我的Check_login类 - 它将在下一页(inside_page.php)中实例化 -
类:
<?php
if (! defined('EXT')){ exit('Invalid file request'); }
class Check_login {
private $login = null ;
function __construct() {
session_start();
$this->login = $_SESSION['login'];
if ($this->login != '1') {
header('location:../index.php');
}
// $login = $this->login ;
// echo $login ;
// $session = $_SESSION['login'];
// echo $session ;
// ----------------------
// commenting out the redirect and echoing the
// session variable shows 1 in IE and Safari, but
// empty in Chrome, Opera and Firefox
}
}
?>
page(inside_page.php):
<?php
require('../lib/Check_login.php');
session_start();
$login = new Check_login;
?>
再一次,任何帮助都会非常棒。谢谢!
答案 0 :(得分:3)
我想出了这个 - 我不能说我理解为什么会这样,但这就解决了我的问题。在我的登录页面中,在验证登录凭据后,我将会话变量“login”设置为1,然后显式重定向到另一个页面。我在测试后意识到,使用相对URL进行重定向可以解决问题。
我的原始帖子甚至没有说明网址,因为我认为没有必要,但问题出在哪里 -
<?php
// log in page
// if logged in successfully set the session variable
session_start();
if (// log in credentials good) {
$_SESSION['login'] = '1';
header('location:https://www.somedomain.com/inside_page.php'); // *** PROBLEM
}
?>
通过相对设置位置,我的问题就消失了 -
<?php
// log in page
// if logged in successfully set the session variable
session_start();
if (// log in credentials good) {
$_SESSION['login'] = '1';
header('location:inside_page.php'); // *** FIX
}
?>
我仔细检查了,安全连接肯定不是问题,它是显式网址。
使用相对位置,我的会话变量出现在Internet Explorer,Safari,Chrome,Opera和Firefox的下一页中。使用显式位置,它出现在IE和Safari中,但不在CHROME,OPERA和FIREFOX中。
您可以轻松地重新创建并自行尝试 -
<?php
// ------- page_one.php -------
session_start();
$_SESSION['val'] = '1';
header("location:http://www.somedomain.com/page_two.php") ;
// header("location:page_two.php") ;
?>
<?php
// ------- page_two.php -------
session_start();
if ($_SESSION['login'] != '1') {
echo 'false' ;
} else {
echo 'true' ;
}
?>
希望这可以节省其他人一些时间(并且头痛)。
答案 1 :(得分:0)
将session_start()
移到inside_page.php。
会话应该在脚本的最开头启动,几乎总是在包含之前启动。
答案 2 :(得分:0)
我在尝试将digitalaccesspass(DAP)集成到PHP5.5服务器上时遇到了类似的问题(打破了所有Webkit / Blink浏览器,因此破坏了Chrome,Safari和Opera的登录),这些变化的星座也有所帮助。
session_start()
header("Location:")
来电)之前,我添加了session_write_close()
。对于通过Google遇到此问题的人,如果您使用DAP进行此操作,请在/dap/authenticate.php中进行这些更改
答案 3 :(得分:0)
我的PHP会话也无法在Chrome中运行。
我发现PHPSESSID Cookie路径未在我的网页之间同步,尽管每个网页只使用session_start()
来初始化每个会话。
将session_start()
上方的这一行添加到我向会话中写入数据的页面解决了问题:
session_set_cookie_params(600, '/');
请参阅:
http://php.net/manual/en/function.session-set-cookie-params.php