我有一个允许公共访问某些网页的网站,但需要登录其他网页。我有一个从所有页面登录的链接,成功登录后我想要做的是将用户发送回他们点击登录链接时所在的页面。我知道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拼写错误拼写,傻我......)
答案 0 :(得分:2)
第一个例子中$_SERVER['HTTP_REFERER']
的价值是多少?它设置正确吗?
你知道,如果只输入地址栏中的URL,大多数浏览器都不会发送引用字符串。
答案 1 :(得分:1)
在登录验证页面中,引用者将是登录页面,而不是原始页面(除非您使用存储在cookie或HTTP basic / digest auth中的凭证)。
您可以做的是,在登录页面中,用户输入详细信息,使用登录页面请求的引用者隐藏字段,然后将其传递给验证登录的脚本并执行转发登录成功。
更好的是:由于用户可能不会发送引用(它在大多数浏览器中都是可配置的),因此具有指向登录页面的链接在查询字符串中包含原始页面。然后按上述步骤操作,但使用此值代替referer。
要明确:
<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();
}