会话和php重定向不';行不通
我正在制作一个PHP脚本会话和php重定向不';行不通,php,session,redirect,Php,Session,Redirect,我正在制作一个PHP脚本check.PHP,用于检查用户是否登录。只有一个用户,因此密码直接写在php代码中。check.php包含在每个相关页面的顶部(第1行),并带有一行 代码 我已经删除了密码和域名。除此之外,下面是我的代码。 这里的要点是,在登录页面键入密码,然后通过POST将其发送到此脚本 如果密码正确xxx,会话login将存储true 如果密码不正确,但已设置,这意味着用户键入了错误的内容,则任何现有会话都将以会话\u destroy()结束,这意味着用户已注销 如果他到达一个页面
check.PHP
,用于检查用户是否登录。只有一个用户,因此密码直接写在php代码中。check.php
包含在每个相关页面的顶部(第1行),并带有一行
代码
我已经删除了密码和域名。除此之外,下面是我的代码。
这里的要点是,在登录页面键入密码,然后通过POST将其发送到此脚本
如果密码正确xxx,会话login
将存储true
如果密码不正确,但已设置,这意味着用户键入了错误的内容,则任何现有会话都将以会话\u destroy()
结束,这意味着用户已注销
如果他到达一个页面,但未登录,则会话登录
应为false或未设置,这意味着将使用}elseif(!($\u会话['login']){
最后,如果他单击一个logout按钮,他将被发送到此脚本,url为:check.php?logout=true
。最后一个elseif语句中的logout=true
应该被捕获在$\u GET
中,会话应该在那里结束
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
header("Location: http://www.url.com/administration/index.php");
} elseif (isset($_POST['password'])) { // Wrong password
session_destroy();
header("Location: http://www.url.com/administration/login.php?true");
} elseif(!($_SESSION['login'])) { // Check at every page
header("Location: http://www.url.com/administration/login.php");
} elseif($_GET['logout']) { // Log out
session_destroy();
header("Location: http://www.url.com/");
}
ob_flush();
?>
返回以下输出:
Input: xxxx
Session before:
Session after: 1
The first if works
(xxxx是密码;它是正确的。)
这是您正在登录的情况。您刚刚编写了密码,并已发送到check.php
因此,我可以在这里看到,它按预期访问第一个if
。会话被正确设置为true
(或1
)。当我刷新页面时,会话不再被设置。不是吗
而标题
重定向显然没有任何作用
更新2 因此,多亏了下面@EmilF的回答,我发现我的会话id(我可以用
echo session_id();
打印到屏幕上)在每次换页或页面刷新时都会更改为某个新的随机数。我看起来好像忘记了会话中存储的数据,因为新的会话id指向其他地方
通过使用:
<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...
好的,让我们在这里列出您可以调试的所有内容,并提及您已经完成的工作(以便其他人可以阅读):
- 您是否安装了类似的软件?然后您可以查看
位置:
标题是否发送到浏览器
- 我想您没有收到任何错误消息,是吗?您是否设置了
错误报告(E_ALL);
- 尝试对
$\u POST
数组执行var\u dump()
- 您的浏览器中是否也有检查Cookie的工具?我通常使用Firefox web developer工具栏插件,它有一个菜单Cookie->show Cookie information。在那里您应该会看到一个
PHPSESSID
Cookie(登录后)。如果没有,您的URL应该包含一些关于会话id的信息(看起来像这样:?PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4
)。否则,PHP找不到会话,因为它不知道哪个会话属于您
如果这无助于检查cookie是否已设置:
- 再次打开您的头插件,然后执行登录。检查服务器是否向您发送cookie。这必须通过
设置cookie
命令完成。它可能如下所示:设置cookie:PHPSESSID=514515ca274866b9f0b5b2520b6fcbb4;path=/
- 如果服务器未设置cookie,请检查
php.ini
中的设置。必须有一个设置会话。使用\u cookies=1
,该设置必须设置为1
或On
以允许php使用cookie
- 如果服务器确实设置了cookie,但您的浏览器不允许,请检查浏览器的cookie选项。还请检查
会话的php.ini
设置。仅使用\u cookies=0
。如果设置为1
,则如果浏览器不接受cookie,则禁止php使用URL。这通常是禁止的出于安全原因,因为人们将URL复制到朋友,然后这些朋友将接管登录会话;),所以只需将其设置为0
,以进行调试
var\u dump()
session\u start()
的返回值。如果PHP无法正确启动会话,它将返回false
尝试使用会话id()打印PHPSESSID。如果继续刷新,会得到相同的输出吗 如果没有,请尝试将id设置为:session_id('cutckilc16fm3h66k1amrrls96') 它现在应该可以工作了,但是所有用户都可以使用相同的会话 问题可能是这样的:
经过许多日日夜夜的测试、阅读和提问,在参与者对这个问题的大量帮助下——非常感谢您的努力!——我慢慢地找到了这个相当神秘的问题解决方案。
我找到了一个解决方案,但我仍然没有解释… 因此,如更新2中所述,我从@EmilF的回答中发现会话id不断变化。当时我的想法是怀疑服务器/主机问题。我联系了主机one.com,他起初和我一样不明白为什么它不起作用 但后来他告诉我,
check.php
文件的开头有一些奇怪的符号。我在自己的编辑器中看不到它们。直到我通过one.com提供的基于浏览器的FileManager软件访问该文件,它们才可见
问题和解决办法
文件顶部如下所示:
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
...
ï»谜团在此解开:
您将找到最佳答案:
您的.PHP文件中HTML之前是否有PHP代码?是否安装了类似的程序?然后您可以查看位置:
标题是否发送到浏览器。我想您没有安装
<?
ob_start();
session_start();
if($_POST['password'] == 'xxx') { // Correct password
$_SESSION['login'] = true;
...