未存储PHP会话信息
我正在尝试创建一个非常简单的网站,在这里您可以转到主页并登录,其代码如下example.org/login/index.php:未存储PHP会话信息,php,session,Php,Session,我正在尝试创建一个非常简单的网站,在这里您可以转到主页并登录,其代码如下example.org/login/index.php: <?php session_start(); $warning = $_GET['warning']; $nolog = $_GET['nolog']; $username = "Welcome, please log in"; if ($warning) { $username = "Wrong User
<?php
session_start();
$warning = $_GET['warning'];
$nolog = $_GET['nolog'];
$username = "Welcome, please log in";
if ($warning) {
$username = "Wrong Username/Password Combination";
}
if ($nolog) {
$username = "Page inaccessible: Login required";
}
if ($logout) {
$username = "Thank you for your session";
}
?>
<!DOCTYPE html>
<body>
<div class="center">
<span class="warning"><?= $username ?></span>
<form action="submit.php" method="post">
<span class="formField">Username:</span><br>
<input type="text" name="user" class="field">
<br>
<span class="formField">Password:</span><br>
<input type="password" name="password" class="field">
<br>
<br>
<input type="submit" name="submit" value="Submit" class="field">
</form>
</div>
</body>
</html>
用户名:
密码:
提交页面看起来是这样的(当我让它工作时,我不会像这样硬编码用户名和密码,现在只是为了简洁)example.org/login/submit.php:
<?php
session_start();
$username = $_POST['user'];
$password = $_POST['password'];
if ($username == "admin" && $password == "12345") {
$_SESSION['loggedin'] = TRUE;
header("Location: http://www.example.org/welcome/");
die();
}
else {
$_SESSION['loggedin'] = FALSE;
header("Location: http://www.example.org/login/index.php?warning=true");
die();
}
?>
<?php
session_start();
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] == FALSE){
unset($_SESSION);
session_destroy();
header("Location: http://www.example.org/login/index.php?nolog=true");
}
?>
<!DOCTYPE html>
<body>
Hi
</body>
</html>
欢迎页面如下所示example.org/welcome/index.php:
<?php
session_start();
$username = $_POST['user'];
$password = $_POST['password'];
if ($username == "admin" && $password == "12345") {
$_SESSION['loggedin'] = TRUE;
header("Location: http://www.example.org/welcome/");
die();
}
else {
$_SESSION['loggedin'] = FALSE;
header("Location: http://www.example.org/login/index.php?warning=true");
die();
}
?>
<?php
session_start();
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] == FALSE){
unset($_SESSION);
session_destroy();
header("Location: http://www.example.org/login/index.php?nolog=true");
}
?>
<!DOCTYPE html>
<body>
Hi
</body>
</html>
你好
我知道这是很多代码,但是当我第一次尝试在欢迎页面上运行它时,返回一个错误,说它不可访问,并将我发送回登录页面,但第二次它似乎工作正常,并让我登录。有人能理解为什么会这样吗
编辑:
<?php
session_start();
$warning = $_GET['warning'];
$nolog = $_GET['nolog'];
$username = "Welcome, please log in";
if ($warning) {
$username = "Wrong Username/Password Combination";
}
if ($nolog) {
$username = "Page inaccessible: Login required";
}
if ($logout) {
$username = "Thank you for your session";
}
?>
<!DOCTYPE html>
<body>
<div class="center">
<span class="warning"><?= $username ?></span>
<form action="submit.php" method="post">
<span class="formField">Username:</span><br>
<input type="text" name="user" class="field">
<br>
<span class="formField">Password:</span><br>
<input type="password" name="password" class="field">
<br>
<br>
<input type="submit" name="submit" value="Submit" class="field">
</form>
</div>
</body>
</html>
在深入研究之后,我发现这个问题只存在于Google Chrome和Firefox中,而不存在于Internet Explorer或Apple Safari等其他浏览器中。这将进入浏览器的渲染引擎。是否有人知道我可以使用会话ID的另一种方法,它可以在所有浏览器上绕过整个问题,或者是验证用户的另一种方法?尝试使用以下方法
define('BASE_URL', 'http://www.example.org/');
if ($username == "admin" && $password == "12345") {
$_SESSION['loggedin'] = TRUE;
header("Location:".BASE_URL."welcome.php");
exit();
} else {
header("Location:".BASE_URL."index.php");
exit();
}
在欢迎页面的开头添加以下内容
session_start();
if(!isset($_SESSION['loggedin'])){
header("Location:".BASE_URL."index.php");
exit();
}
试着使用下面的方法
define('BASE_URL', 'http://www.example.org/');
if ($username == "admin" && $password == "12345") {
$_SESSION['loggedin'] = TRUE;
header("Location:".BASE_URL."welcome.php");
exit();
} else {
header("Location:".BASE_URL."index.php");
exit();
}
在欢迎页面的开头添加以下内容
session_start();
if(!isset($_SESSION['loggedin'])){
header("Location:".BASE_URL."index.php");
exit();
}
如果你注意我提到的文件名,我是说我将浏览器指向example.org/login/submit.php,然后将其转发到www.example.org/welcome/index.php
在Google Chrome和Mozilla Firefox中,他们关心的是在网站之前是否有一个www,而在Internet Explorer和Safari中,他们不关心这个区别。在我的服务器上,网站www.example.org和example.org是彼此的镜像(这是一个单独的安全问题),因此Google Chrome和Mozilla Firefox将以不同的方式对待它们,并为它们提供不同的$u服务器全局变量,然而,Internet Explorer和Safari并不关心这一区别。如果你注意我提到的文件名,我是说我将浏览器指向example.org/login/submit.php,然后将其转发到www.example.org/welcome/index.php
在Google Chrome和Mozilla Firefox中,他们关心的是在网站之前是否有一个www,而在Internet Explorer和Safari中,他们不关心这个区别。在我的服务器上,网站www.example.org和example.org是彼此的镜像(这是一个单独的安全问题),因此Google Chrome和Mozilla Firefox将以不同的方式对待它们,并为它们提供不同的$u服务器全局变量,然而,Internet Explorer和Safari并不关心这一差异。只要这是一个真正的点:
标题(“位置:http://www.example.org/welcome/");代码>应该是:标题(“位置:http://www.example.org/welcome.php");代码>?嗯,当我尝试你的代码时,它对我有效。设置所有适当的会话等,并将我转发到正确的位置…@Rasclatt很抱歉删除我以前的评论,但我不想保留我的用户名/密码信息。我将链接更改为,但仍然不起作用。您能否在代码示例的上面标记每个代码块的每个页面的名称?比如welcome/index.php:cti将尝试它。您可以再次删除它。如果这是一个真实的点:header(“位置:http://www.example.org/welcome/");代码>应该是:标题(“位置:http://www.example.org/welcome.php");代码>?嗯,当我尝试你的代码时,它对我有效。设置所有适当的会话等,并将我转发到正确的位置…@Rasclatt很抱歉删除我以前的评论,但我不想保留我的用户名/密码信息。我将链接更改为,但仍然不起作用。您能否在代码示例的上面标记每个代码块的每个页面的名称?比如welcome/index.php:cti将尝试它。您可以再次删除它。如果这是一个真实的点:header(“位置:http://www.example.org/welcome/");代码>应该是:标题(“位置:http://www.example.org/welcome.php");代码>?嗯,当我尝试你的代码时,它对我有效。设置所有适当的会话等,并将我转发到正确的位置…@Rasclatt很抱歉删除我以前的评论,但我不想保留我的用户名/密码信息。我将链接更改为,但仍然不起作用。您能否在代码示例的上面标记每个代码块的每个页面的名称?比如welcome/index.php:cti将尝试它。您可以再次删除它..为什么定义基本URL会有所不同?至于将loggedin变量设置为true或nothing的方法,该方法没有帮助,但无论如何还是要感谢您,为什么定义基本URL会有所不同呢?至于将loggedin变量设置为true或nothing的方法,该方法没有帮助,但无论如何还是要感谢您,为什么定义基本URL会有所不同呢?至于您将loggedin变量设置为true或nothing的方法,该方法没有帮助,但还是要感谢您