【问题标题】:What's wrong with the way I am redirecting between two pages?我在两个页面之间重定向的方式有什么问题?
【发布时间】:2011-01-11 00:10:21
【问题描述】:

再次,非常菜鸟的 PHP 问题。

我有一个非常简单的登录页面

<?php
  session_start();
  if (isset($_SESSION['username']))
  {
    header('Location: main.php');
    exit();
  }
  if (isset($_POST['submit']))
  {
    $user = $_POST['user'];
    $pass = $_POST['pass'];
    if (try_login($user,$pass))
    {
      $_SESSION['username'] = $user;
      header('Location: main.php');
      exit();
    }
  }
?>
<html> <!-- and login form below...  >

还有一个非常简单的主页:

<?php
  session_start();
  if (!isset($_SESSION['username']))
  {
    header('Location: .');
    exit();
  }
?>
<html> <!-- etc, etc -->

我预计会发生以下事情:

  1. 如果我在登录前导航到http://localhost/main.php,我应该被重定向到http://localhost/
  2. 如果我导航到http://localhost/ 并成功登录,我应该会被重定向到http://localhost/

不幸的是,#2 没有发生。我的代码可能有什么问题?

【问题讨论】:

  • 我猜你在 #2 中有错字。否则就没有意义了。
  • 这不是错字。我以为它会起作用。现在我将重定向更改为header('Location: /')

标签: php session redirect


【解决方案1】:

您应该使用完全限定的网址:

header('Location: http://localhost/main.php ');

【讨论】:

  • 这是一种误导:没有必要包含 FQDN(完全限定的域名)。当有一个由虚拟主机配置的 Web 服务器或在不同的主机上部署 Web 应用程序时,对主机名进行硬编码是一件麻烦事。但是,完全限定的 URL 重定向到外部站点所必需的。
  • 有没有可以用来检索主机名的 PHP 变量?
【解决方案2】:

您可能会在此处遇到竞争情况。我遇到过好几次了……你在会话中设置了一些东西,但是下一页看不到它。这通常是由于浏览器请求第二个页面的速度太快,以至于第一个页面没有时间编写会话,因此第二个页面看不到会话变量的更改。

在发送重定向标头之前尝试调用session_write_close()

【讨论】:

    【解决方案3】:

    您必须使用绝对 URI,例如 Location: /Location: /main.php

    【讨论】:

    • 虽然强烈建议使用绝对名称(如果不是,一些浏览器会扼杀它),但“必须”有点夸大其词。许多浏览器将处理相对重定向。包括大多数常见的。
    • 你说得对。感谢您指出那个细节。这里重要的是Location: .肯定不行。
    【解决方案4】:
    <?php
      session_start();
      if (isset($_SESSION['username']))
      {
        header('Location: main.php');
        exit();
      }
    

    这个人应该如何登录?如果 $_SESSION 没有设置用户名 BEFORE ,则重定向您执行任何实际设置该变量的代码。这使得登录代码实际上无法访问。

    【讨论】:

    • @Mark: $_SESSION['username'] 可能已经设置,因为用户在注销之前导航到http://localhost/。我不想再次显示登录表单,而是想将用户重定向到主页。
    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2015-05-09
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多