2009-12-31 134 views
4

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

从我的研究看来,围绕$ _SERVER ['HTTP_REFERER']变量提供了很多建议。基本上,你注意到引用者并将其存储在会话中,然后在完成后重定向到该页面。

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

这是由用户代理设置的。并非所有的用户代理都会设置它,有些提供了将HTTP_REFERER修改为功能的功能。总之,它不能真正被信任。
— [http://php.net/manual/en/reserved.variables.server.php]

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

回答

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['lastvisitpage']设置为当前页面的URL。登录后,您重定向到$_SESSION['lastvisitpage']

由于$_SERVER['HTTP_REFERER']可以在任何时候由用户伪造,所以应该始终把任何其他用户提供的变量视为正确转义。

+1

所以HTTP_REFERER * *是标准的方式来做到这一点呢?我喜欢使用'lastpage'会话变量作为空白引用者的备份的想法。谢谢! – AgentConundrum 2009-12-31 08:58:28

+2

完全没有问题。但要小心SESSION方法,因为您永远不知道用户是否在他/她的浏览器中打开了您网站的多个选项卡。如果这个答案打勾,允许他人知道=) – mauris 2009-12-31 09:01:00

+0

好点(多个标签)。这看起来似乎最适合多种后备。如果存在隐藏的表单元素,请使用它。如果没有,请检查登录页面上的HTTP_REFERER并使用它。如果它也是空白的,可以使用会话说的最后一页,或者将用户返回到主页面。这可能归结为两个选项中的哪一个提供更好的用户体验的意见。 “主页”可能比推到你在另一个标签中打开一个页面减少混乱,但它是在单页签的“尾页”是可靠的情况下,更糟糕的体验。 – AgentConundrum 2009-12-31 09:08:33

0

我会建议做一个AJAX调用来登录用户和成功的AJAX响应只刷新当前页面。

+0

你不能让这样一个重要的特征是JavaScript的依赖,除非你能有一个JavaScript的故障安全备份此。 – mauris 2009-12-31 08:55:04

+0

我非常赞同@thephpdeveloper说的话。当JavaScript不可用时,我真的很喜欢一切工作。 – AgentConundrum 2009-12-31 09:00:57

+0

我更喜欢AJAX调用,但我也有一个标准的登录页面,如果JavaScript不加载。但是页面会重定向到主页面。没有Javascript =不保存您的位置。 – 2009-12-31 09:23:53

3

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

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

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

+2

-1:关于多标签问题,请参阅其他问题。 – 2009-12-31 09:21:14

1
if(user_not_logged_in()) 
{ 
    $link = "http://example.com/login?continue=path/to/current/page"; 
    echo '<a href="'.$link.'">Loign</a>'; 
} 

这就是我和Google这样的网站做的。您需要确保先检查continue变量,然后再对其进行消毒处理。

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


我想你可能会问,如果用户在菜单上的登录链接上点击明确,你会自动认为用户希望被重定向到他们从按下按钮的页面。我相信这是逻辑上的缺陷。以StackOverflow。仅仅因为我按登录并不意味着我想回到我最后的问题。

不过,也有一些情况下,这将是正确的承担人要回去,比如如果我upvoted问题,并得到了弹出告诉我登录。如果我在那里点击链接,假设我想回去是安全的。但只是导航栏上的登录链接没有这个含义。

相关问题