【问题标题】:Incorrectly redirecting user back to a PHP page after submitting a form提交表单后错误地将用户重定向回 PHP 页面
【发布时间】:2010-10-06 23:24:22
【问题描述】:

全部,

这个问题可能有一个非常简单的答案 - 我忽略了一些东西。但也许有人可以告诉我在哪里看...

我有一个 PHP 页面(“index.php”),其中包含一个非常简单的登录表单(例如,用户名和密码)。

当用户单击“提交”按钮时,表单会将值发布到另一个 PHP 页面(“login.php”)。该页面应该确认用户的凭据,然后执行以下操作:

  • 如果用户的凭据不是 正确,将用户重定向到 error.php,以及一个错误 留言
  • 如果用户的凭据是 正确,创建一个会话并设置 $_SESSION['authenticated'] = true,然后将他重定向到“loggedin.php”

[更新]

然后,在 login.php 上,我检查 isset($_SESSION['authenticated']) 返回 true。如果是,则继续。如果没有,将用户重定向回 index.php。

但是,这就是发生的事情。 FIRST 我填写表单(使用有效凭据)并提交时,我可以在 URL 栏中简要看到用户被发送到 login.php,然后是 login.php,但随后 返回到 index.php。

但是,如果我重新输入 相同 凭据并在 SECOND 次提交信息,一切都会正常运行。

所以,简而言之,看起来 login.php 在第一次通过时没有设置 $_SESSION 变量,或者确实如此,但由于某种原因,当我第一次登录时检查它时没有设置.php

在 login.php 上设置变量和在 login.php 上让 isset() 返回 true 之间是否有一些延迟?

或者,还有什么我做错了吗?

以下是相关的(我认为)sn-ps 代码:

在 login.php 中:

session_start();
$_SESSION['authenticated'] = true;
header('Location: http://www.mydomain.com/loggedin.php');

在login.php中:

session_start();
$authenticated = $_SESSION['authenticated'];
if (!isset($authenticated)) {
    header('Location: http://www.footballpoolz.com/mobile/index.php');
    die();
}

非常感谢您提供任何建议或见解!

干杯, 马特·斯图勒

【问题讨论】:

  • 如果有人在没有设置正确凭据的情况下被发送到 level1.php 或 level2.php 会发生什么?也许这些页面中有一些东西正在重定向。
  • 您能否提供任何代码,以便我们查看到底发生了什么?
  • webbiedave - 哇 - 你的洞察力很准确......发生了什么......用户到达 login.php;证件有效;创建了一个会话,我设置了 $_SESSION['fp_user_authenticated'] = true;用户被重定向到 level1.php。这一切都应该如此。然而,level1.php 做的第一件事是检查 isset($_SESSION['authenticated'])。如果返回 false,用户将被重定向回 index.php。显然,这是第一次发生的事情。换句话说,要么 login.php ISN'T setting $_SESSION['authenticated'],要么 level1.php 过早地检查它?

标签: php html forms


【解决方案1】:

我想我可能知道错误的原因。会话必须链接到浏览器和 IP 地址(这样一次可以有多个人登录)。这意味着会话不仅必须存储在服务器端,而且客户端还必须具有指向会话的链接,以便您知道他们在请求数据时登录的人。在所有 HTTP 请求期间,此会话 ID 作为标头的一部分共享。

但是,当您重定向用户时,您并没有给他们发送新标头的机会,是吗?您可能只是向他们发送新页面。这个新页面从来没有看到他们的标题,所以它不知道哪个会话变量(PHP 有数百甚至数千个会话变量)属于他们。当您第二次重新登录时,您正在发送一个标头,因此您正在发送会话 ID,PHP 知道哪个会话变量是您的。

有两种解决方案。首先是找到一种重定向它们的方法,迫使它们发送新的标头。我相信使用header("Location: www.mysite.com/newpage.php"); 会做到这一点。我可能记错了。

另一种方法是在您将会话 id 重定向到 login.php 时临时传递会话 ID,以便您知道他们在第一个页面加载时已登录。初始页面加载后,您不再需要执行此额外步骤,因为每次他们请求页面时都会为您完成。要传递会话 ID,您只需将 ?SID=... 附加到重定向。

http://www.php.net/manual/en/session.idpassing.php

【讨论】:

    【解决方案2】:

    重定向确实会减慢速度并导致额外的服务器负载。您应该做的是发回 index.php 页面,该页面将检测是否有 POST。然后登录用户并显示loggedin.php 文件的内容。无需重定向。

    毕竟,您已经知道用户已通过验证,为什么要将他们重定向到另一个您必须再次检查验证的页面(您刚刚做了)?这更像是“前端控制器”的概念,您的 index.php 在其中充当加载和显示不同页面的路由器。即使他们登录时只是一个欢迎页面。这消除了任何延迟问题。

    你正在做一个 session_start,对吧?

    【讨论】:

    • 在用户的浏览器历史记录中留下没有重定向的 POST 会使 BACK/FORWARD 导航混乱,并导致表单被重新发布并带有模式警告对话框。 PRG 的一个很好的做法是:发布/重定向/获取。
    • dkamins - 非常感谢您的评论。抱歉-我对大部分内容都是新手,但为了确保我正确理解您的观点,您是说将数据从一页发布到第二页,然后将第二页重定向到第三页是一种很好的做法页? GET 是如何/从哪里进入的?
    • POST 后的重定向只会增加一个额外的 BACK 步骤。你仍然应该提防双重职位。发布到单独的页面使得在出现错误时很难重新显示表单。这也意味着同一个表单有 2 个不同的 URL。底线是重定向很昂贵。
    【解决方案3】:

    而不是使用这个 true 。尝试赋予一些价值。

    赞 $_SESSION['username']='mattstuehler'

    并检查

    $loggeduser=$_SESSION['用户名']; if(!empty($loggeduser))

    反正我没有看到任何错误

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2020-09-04
      • 2012-09-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 2014-07-12
      • 2020-02-18
      相关资源
      最近更新 更多