4

是否有任何关于在登录到您的网站后如何将用户返回到其原始页面的“最佳实践”,特别是在 PHP 中?例如,如果我在未登录的情况下查看 StackOverflow 问题,如果我登录,您将如何确保我返回此问题?

根据我的研究,似乎很多建议都围绕着 $_SERVER['HTTP_REFERER'] 变量。基本上,您记下引用者并将其存储在会话中,然后在完成后重定向回该页面。

问题在于 HTTP_REFERER 充其量是不可靠的。

这是由用户代理设置的。不是所有的用户代理都会设置这个,有些提供修改 HTTP_REFERER 作为一个特性的能力。简而言之,它不能真正被信任。
— [ http://php.net/manual/en/reserved.variables.server.php]

对引用者进行的任何编辑以重定向到站点的其他区域都将通过例行权限检查来处理。如果引用者被屏蔽掉,那么简单地将用户重定向到网站的主页而不是他们来自的页面可能是可以接受的。不过,这似乎是不必要的用户敌对,我希望有更好的方法来处理这个问题。

4

4 回答 4

6

在登录页面:

<form action="controller/LoginController" method="post">
<?php

if (isset($_SERVER['HTTP_REFERER'])) {
  echo '<input type="hidden" name="l" value="'.htmlspecialchars($_SERVER['HTTP_REFERER']).'" />';
}

?>
<!-- the rest of the form -->
<input type="submit" />
</form>

在登录控制器中,您获取该$_POST['l']值并查看此 URL 是否在您自己的网站上。如果不是,则重定向到您的默认页面,否则重定向到此 URL。

如果用户已经登录,请确保在您的登录页面上,您将用户重定向回主页或其他内容。这将防止诸如重定向回登录之类的情况。

$_SERVER['HTTP_REFERER']是浏览器的责任。它在大多数情况下也是相当可靠的。如果浏览器没有发送,或者你担心它,你可以使用 session 来代替。

在每个页面上只需设置$_SESSION['lastvisitpage']为当前页面的 URL。登录时,您重定向到$_SESSION['lastvisitpage'].

由于$_SERVER['HTTP_REFERER']可以随时被用户伪造,因此应始终通过正确转义来处理任何其他用户提供的变量。

于 2009-12-31T08:51:47.563 回答
3

如果您自己存储上次访问的页面会更好,也许在会话的帮助下。

如果用户第一次从您的网站请求页面,请启动一个新会话并使用当前 URI初始化last- URI。每当请求另一个页面时更新此最后一个 URI,直到它是登录页面。现在,如果身份验证成功,您可以将用户重定向到last-URI 中的 URI

如果您在每个页面上都有一个登录表单,请使用存储当前 URI 的隐藏输入。

于 2009-12-31T08:54:30.983 回答
1
if(user_not_logged_in())
{
    $link = "http://example.com/login?continue=path/to/current/page";
    echo '<a href="'.$link.'">Loign</a>';
}

这就是我和谷歌等网站的做法。但是,您需要确保检查 continue 变量并首先清除奇怪的 URL。

另一种选择是使用 AJAX,并允许用户从任何页面登录。用户登录,您通过 AJAX 提交表单,请求返回时刷新。


我想您可能会问用户是否专门单击菜单上的登录链接,您会自动认为用户希望被重定向到他们按下按钮的页面。我认为这是逻辑上的缺陷。以 StackOverflow 为例。仅仅因为我按下登录并不意味着我想回到我上次提出的问题。

但是,在某些情况下,假设此人想要返回是正确的,例如,如果我对一个问题投了赞成票并让弹出窗口告诉我登录。如果我点击那里的链接,可以安全地假设我想返回。但是导航栏上的登录链接并没有那种隐含的含义。

于 2009-12-31T09:12:04.027 回答
0

我建议进行 AJAX 调用以登录用户,并在成功的 AJAX 响应时刷新当前页面。

于 2009-12-31T08:54:12.673 回答