会话和php重定向不起作用

Ste*_*ven 6 php session redirect

我正在制作一个PHP脚本check.php来检查用户是否已登录.只有一个用户,因此密码直接写在php代码中.将check.php被包括在与行各相关页面的顶部(1号线)<? include "check.php"; ?>.

代码

我已经删除了密码和域名.除此之外,以下是我的代码.这里的要点是您在登录页面输入密码,然后通过POST将其发送到此脚本.

如果密码是正确的 xxx,会话login将存储true.

如果密码不正确,但设置,意味着用户键入了错误,则任何现有会话都将结束session_destroy(),这意味着他已注销.

如果他到达页面但未登录,则会话login应为false或未设置,这意味着} elseif(!($_SESSION['login'])) {将使用该会话.

最后,如果他点击退出按钮,他将使用url发送到此脚本:check.php?logout=true.本logout=true应在被捕获$_GET在最后elseif语句和会话应该在那里结束.

<?
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();
?>
Run Code Online (Sandbox Code Playgroud)

问题

在每个if语句中,我尝试重定向.我使用了header("Location:...),但它在任何情况下都不起作用.因为header命令必须是第一个请求到根据规格被发送到浏览器,我使用的ob_start();ob_flush();这里所描述.无论有没有这些都无效.

此外,会话存在无法存储内容的问题.我无法true在会话中存储某些原因.我的代码是否存在问题导致其失败?

作为测试,我试图echo在每个if/ ifelse语句中编写命令.从那里我发现脚本总是进入第三个语句 - 带有的那个!($_SESSION['login']).

这个问题

到现在为止还挺好.这告诉我脚本能够检测到会话未设置.
剩下的两个问题是:

  • 为什么语句中的重定向不起作用,因为没有重定向发生,并且
  • 为什么不能首先设置会话.

任何建议将被认真考虑.


更新1

为了清楚说明发生了什么(以及什么不发生)我echo在不同的地方放了一些东西.以上代码的这个片段带有一些额外的echos:

...
echo "Input: " . $_POST['password'];
echo "<br>Session before: " . $_SESSION['login'];

if($_POST['password'] == 'xxxx') {  // Correct password

    $_SESSION['login'] = true;
    header("Location: http://www.url.com/administration/index.php");
    echo "<br>Session after: " . $_SESSION['login'];
    echo "<br>The first if works";

} ...
Run Code Online (Sandbox Code Playgroud)

返回以下输出:

Input: xxxx
Session before:
Session after: 1
The first if works
Run Code Online (Sandbox Code Playgroud)

(xxxx是密码;它是正确的.)

这是您登录的情况.您刚刚写了密码并已发送到check.php.

所以,我可以在这里看到它if按照预期访问第一个.会话正确设置为true(或1).当我刷新页面时,会话不再被设置.不应该吗?

header重定向显然没有做任何事情.


更新2

所以,感谢下面@EmilF的答案,我发现我的会话ID - 我可以打印到屏幕上echo session_id();- 在每次页面移位或页面刷新时都会改变它看起来像一些新的随机数.我看起来好像存储在会话中的数据被遗忘了,因为新的会话ID指向其他地方.

通过使用:

<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...
Run Code Online (Sandbox Code Playgroud)

其中cutckilc16fm3h66k1amrrls96只是一个随机数,会话ID是固定的,现在可以在页面刷新后再次检索存储的数据.这非常有效; 虽然有点奇怪但是有必要.

现在我只需要头重定向工作......

嗯,这闻起来像是被关闭的东西.会话和标头功能已更改.也许这是来自主机的一些PHP设置.阻止标头请求的东西.

未完待续...

更新3 - 解决了

请参阅下面的答案.

当我将文件更改为另一种编码格式时,例如从ANSI到UTF-8,会在文件的开头创建一些奇怪的符号.创建的符号是,我在自己的编辑器中看不到它们.因为它们位于php脚本的前面,所以它们会阻止headersession_start()正常工作.为什么它们被创造出来对我来说仍然是一个谜.

Dej*_*vic 2

谜团在这里解开: 字节顺序标记

在此输入图像描述

您会找到的最佳答案:

/sf/answers/562029121/