2010-05-14 46 views
1

我有一个网站,允许公众访问某些网页,但需要其他人登录。我有一个从所有页面登录的链接,并且成功登录后我想要做的是将用户发回到他们点击登录链接时所在的页面。我知道HTTP_REFERER可能被欺骗,有时会被某些主机和代理剥离出去,但由于它严格限制在我自己的网站中,并且只是为用户提供便利,所以我并不太担心。

虽然我很好奇它为什么不与重定向结合使用。我设置了一个可见字段来包含http referer的值,并且它正确显示。因此该页面正在获取referrer变量的值。但是,当我尝试这个:

$home_url = $_SERVER['HTTP_REFERER']; 
header('Location: ' . $home_url); 

它不起作用。另一方面,这样做:

$home_url = 'http://' . $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/discussions.php'; 
header('Location: ' . $home_url); 

所以我知道标题位置部分的作品。任何想法为什么它不想与http_referer变量一起工作?

(另外,它驱动该引荐拼写错误任何人疯了吗?我一直使用OED拼音打错了,我傻...)

回答

1

在登录验证页面,引用者将是登录页面,而不是原始页面(除非您使用存储在cookie或HTTP basic/digest auth中的凭据)。

您可以做的是,在登录页面中,用户输入详细信息,使用引用登录页面请求的引用程序的隐藏字段,然后将其传递给验证登录并执行转发的脚本如果登录成功。更好的是:由于用户可能不会发送引用程序(它可在大多数浏览器中配置),因此链接到登录页面的查询字符串中包含原始页面。然后像上面那样继续,但是使用这个值而不是引用者。

要明确:

<form method="post" action="login"> 
... 
<input name="user" type="text" /> 
<input name="password" type="password" /> 
<input name="referer" type="hidden" value="<?php echo urlencode($_SERVER['HTTP_REFERER']) ?>" /> 
</form> 

然后

<?php 
if (login_is_successful() && !empty($_POST['referer']) && !is_array($_POST['referer'])) { 
    header("Location: ".urldecode($_POST['referer'])); 
    die(); 
} 
+0

谢谢 - 我刚刚想到的是,几分钟前,一边吃晚餐。 – EmmyS 2010-05-15 00:44:39

2

什么的$_SERVER['HTTP_REFERER']在第一个例子中的价值?它设置正确吗?

您知道,如果您只是在地址栏中输入网址,大多数浏览器都不会发送引荐字符串。

相关问题