我的实际实现要复杂得多,包括身份验证和其他一些东西,但最简单的形式,这就是我遇到的问题。使用标题重定向不会将自己显示为引用者。
所以,假设我有三个页面:start.php,middle.php和end.php
start.php
<html><body>
<a href="middle.php">middle</a>
</body></html>
middle.php
<?php
header('Location: end.php');
?>
end.php
<?php
echo 'The referer is: ' . $_SERVER['HTTP_REFERER'];
?>
当你按照链接进行操作时,你最终会在end.php,但是引用者不是middle.php。是否有任何其他重定向方法可用于纠正此问题,或其他任何我可以做的事情?
干杯
修改 在这种情况下,目标页面是第三方供应商。他们必须验证的唯一方法是引用URL。我无法控制。我只需要我的页面进行重定向以发送正确的URL。这个重定向方法有没有其他选择,而不是分开不信任http_referer的原因?
答案 0 :(得分:3)
很抱歉,但是它不受您的控制,只有浏览器可以发送该标题 - 而不是全部都可以。它可以很容易伪造,所以不要依赖它。
有关此php bug的更多信息(标记为非错误)。
答案 1 :(得分:1)
由于HTTP_REFERER不值得信任(可以从外部轻松修改),因此您可以在每次请求后轻松存储在会话中访问的最后一页。然后在重新加载时轻松检索它。
含义,将引荐来源加载为$ refer_url = $ _SESSION [“refer_url”]。然后保存它$ _SESSION [“refer_url”] = $ current_absolute_url;在结束每个请求时。
但请注意,这可能是一个并发问题。拥有并行请求(使用例如AJAX)可以轻松地使会话相信它来自实际上没有的页面。
答案 2 :(得分:0)
这个问题在SO上出现了很多次(我现在找不到任何欺骗),我认为总是在底线上没有在标准中定义什么是浏览器来设置在这种情况下引用。
是否可以使用GET参数明确指定它?
答案 3 :(得分:0)
我会建议这样的事情:
header('Location: end.php?from=' . urlencode($_SERVER['PHP_SELF'));
然后在您想知道重定向发布位置的页面中:
echo 'redirected from ' . urldecode($_GET['from']);
答案 4 :(得分:0)
您在尝试使用Referrer标题信息?
如果它是用于验证/验证请求的来源,那么您可以考虑尝试另一种方法。正如El Yobo指出的那样,推荐者标题并不是确定某人请求来自何处的简单方法。
答案 5 :(得分:0)
我选择了旧的元刷新方法。这使得引用URL能够满足需要它的供应商的需求。任何不需要它的供应商仍然使用标题功能,以提高速度和易用性。