【发布时间】:2011-11-22 21:48:15
【问题描述】:
我有一个 PHP 站点,它有一个登录页面。 我还有一个 order.php 页面。当用户未登录时,订单页面首先将用户重定向到登录页面。 我希望当用户从订单页面重定向到登录页面然后成功登录时用户应该重定向回订单页面。 当用户从其他页面进入登录页面时,成功登录后,用户应该重定向到 index.php 页面。 我将如何做到这一点?有什么想法吗?
【问题讨论】:
标签: php
我有一个 PHP 站点,它有一个登录页面。 我还有一个 order.php 页面。当用户未登录时,订单页面首先将用户重定向到登录页面。 我希望当用户从订单页面重定向到登录页面然后成功登录时用户应该重定向回订单页面。 当用户从其他页面进入登录页面时,成功登录后,用户应该重定向到 index.php 页面。 我将如何做到这一点?有什么想法吗?
【问题讨论】:
标签: php
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>
---替换为---
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
//
// Form content
//
</form>
【讨论】:
只需在链接中使用 URL。 order.php 中的 url 将是:http://somesite.com/login.php?url=order.php
然后在您的登录页面中,您可以阅读$_GET["url"] 并决定是将用户重定向回来,还是将他重定向到 index.php。
【讨论】:
当用户未登录时,订单页面首先将用户重定向到登录页面。
为什么要额外重定向?
为什么不直接显示登录表单并在成功登录后重定向到同一页面?
这里是 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";
【讨论】:
您可以设置跟踪返回页面的 cookie 或会话值。登录成功后,查看是否有返回页面。如果是这样,请转到该页面。如果没有,请转到默认的欢迎页面。
【讨论】:
在重定向到登录页面之前将登录目标存储到会话中。
例子:
order.php 页面检查用户是否已经登录,并在必要时调用login.php。在重定向到 login.php 页面之前,它会将登录目标存储为自身 $_SESSION['loginTarget'] = 'order.php';header('Location: '.$_SESSION['loginTarget'], true, 303); exit;
由于登录目标存储在会话中,您可以轻松地在登录页面上进行错误处理,甚至可以创建一个新的用户帐户而不是登录(无需将 url 中的目标传递到每个页面)。
【讨论】: