【问题标题】:How to redirect back to the previous page in PHP?如何在 PHP 中重定向回上一页?
【发布时间】:2011-11-22 21:48:15
【问题描述】:

我有一个 PHP 站点,它有一个登录页面。 我还有一个 order.php 页面。当用户未登录时,订单页面首先将用户重定向到登录页面。 我希望当用户从订单页面重定向到登录页面然后成功登录时用户应该重定向回订单页面。 当用户从其他页面进入登录页面时,成功登录后,用户应该重定向到 index.php 页面。 我将如何做到这一点?有什么想法吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    order.php

    <?php 
    if (!logged_in()){
       header("Location: login.php?referrer=order");
    }
    ?>
    

    登录.php

    <?php 
    if (login_successful()){
       switch($_GET['referrer'])){
          case 'order':
              header("Location: order.php");
          break;
          case 'other':
              header("Location: other.php");
          break;
          default:
              header("Location: index.php");
       }
    }
    ?>
    

    表格

    <form method="post" action="login.php">
        //
        // Form content
        // 
    </form>
    

    ---替换为---

    形成 phpself

    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        //
        // Form content
        // 
    </form>
    

    【讨论】:

    • 我在登录页面中添加了 if(isset($_POST['login'])) 的条件时执行此操作。因此,当我单击登录按钮时,它会给我错误,因为 URL 中没有参数,只有 login.php 剩下。
    • 这种情况我该怎么办
    • 我更新了答案。如果你愿意,你也可以在会话中保存推荐人
    【解决方案2】:

    只需在链接中使用 URL。 order.php 中的 url 将是:
    http://somesite.com/login.php?url=order.php
    然后在您的登录页面中,您可以阅读$_GET["url"] 并决定是将用户重定向回来,还是将他重定向到 index.php。

    【讨论】:

      【解决方案3】:

      当用户未登录时,订单页面首先将用户重定向到登录页面。

      为什么要额外重定向?
      为什么不直接显示登录表单并在成功登录后重定向到同一页面?

      这里是 auth.php 页面的一个简短示例

      <?
      if (isset($_POST['auth_name'])) {
        $name  = mysql_real_escape_string($_POST['auth_name']);
        $pass  = MD5($_POST['auth_name'].$_POST['auth_pass']);
        $query = "SELECT * FROM users WHERE name='$name' AND pass='$pass'";
        $res   = mysql_query($query) or trigger_error(mysql_error().$query);
        if ($row = mysql_fetch_assoc($res)) {
          session_start();
          $_SESSION['user_id'] = $row['id'];
        }
        header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
        exit;
      }
      if (isset($_GET['action']) AND $_GET['action']=="logout") {
        session_start();
        session_destroy();
        header("Location: http://".$_SERVER['HTTP_HOST']."/");
        exit;
      }
      if (isset($_REQUEST[session_name()])) session_start();
      if (empty($_SESSION['user_id'])) {
        return;
      } else {
        include 'top.php';
      ?>
      <form method="POST">
      <input type="text" name="auth_name"><br>
      <input type="password" name="auth_pass"><br>
      <input type="submit"><br>
      </form>
      <? 
        include 'bottom.php';
      }
      exit;
      ?>
      

      现在您只需使用以下一行来保护任何页面

      require "auth.php";
      

      【讨论】:

      • 我认为这是一个好方法。如果用户已经登录,订单页面必须自行检查(出于安全原因)。其他页面可以只链接到想要的页面,而不必自己检查登录状态,这为编写链接提供了一种“自然”的方式。链接定义了要加载的目标,目标知道它是否需要登录。
      • 虽然不需要制作订单页面来检查任何东西。在 auth.php 中进行所有用户验证,并在订单页面中要求它。就这样。我发布了一个例子来玩。
      • 您的示例对我来说看起来不错,一个问题是:您在此 auth.php 文件中包含了登录公式,您将如何允许为新用户创建新帐户并为现有用户登录?
      • 现有用户只需使用此表单,注册用户可以添加一个链接到注册页面。或者我没有得到你的问题
      • 如果您链接到注册页面,那么您将失去登录目标(订单页面)。我认为实现它会很复杂,您可以在注册和登录之间切换(但订单页面只需要一个登录用户,而不关心它是新用户还是现有用户)。
      【解决方案4】:

      您可以设置跟踪返回页面的 cookie 或会话值。登录成功后,查看是否有返回页面。如果是这样,请转到该页面。如果没有,请转到默认的欢迎页面。

      【讨论】:

      • 如果您在共享 cookie 的 2 个窗口中打开页面,可能会产生有趣的效果。
      • 怎么样?如果您只想将某些页面设置为要返回的页面,则使用引荐来源网址或基于 url 的解决方案不起作用。例如,我转到订单页面,然后跳到登录页面,但我忘记了密码,所以我转到恢复表单,这会将我带到成功页面。然后我收到一封电子邮件,其中包含重置密码的链接,然后我可以重置密码并转到登录页面。现在,当我在没有 cookie 或会话跟踪的情况下登录时,我该去哪里?
      【解决方案5】:

      在重定向到登录页面之前将登录目标存储到会话中。

      例子:

      1. order.php 页面检查用户是否已经登录,并在必要时调用login.php。在重定向到 login.php 页面之前,它会将登录目标存储为自身 $_SESSION['loginTarget'] = 'order.php';
      2. 登录页面成功完成后,调用登录目标。 header('Location: '.$_SESSION['loginTarget'], true, 303); exit;

      由于登录目标存储在会话中,您可以轻松地在登录页面上进行错误处理,甚至可以创建一个新的用户帐户而不是登录(无需将 url 中的目标传递到每个页面)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-24
        • 2020-03-27
        • 2012-07-16
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-29
        • 2017-05-25
        相关资源
        最近更新 更多