我想在我的网站中使用$_SERVER['HTTP_REFERER']
,但我得到以下内容:
Notice: Undefined index: HTTP_REFERER
我尝试过打印$_SERVER
。这输出如下:
Array
(
[HTTP_HOST] => 192.168.1.10
[HTTP_USER_AGENT] => Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => en-us,en;q=0.5
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[PATH] => /sbin:/usr/sbin:/bin:/usr/bin
[SERVER_SIGNATURE] => Apache/2.2.3 (CentOS) Server at 192.168.1.10 Port 80
[SERVER_SOFTWARE] => Apache/2.2.3 (CentOS)
[SERVER_NAME] => 192.168.1.10
[SERVER_ADDR] => 192.168.1.10
[SERVER_PORT] => 80
[REMOTE_ADDR] => 192.168.1.77
[DOCUMENT_ROOT] => /var/www/html
[SERVER_ADMIN] => root@localhost
[SCRIPT_FILENAME] => /var/www/html/sandeep/test/hash.php
[REMOTE_PORT] => 53851
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /sandeep/test/hash.php
[SCRIPT_NAME] => /sandeep/test/hash.php
[PHP_SELF] => /sandeep/test/hash.php
[REQUEST_TIME] => 1347365919
)
任何人都可以帮助我找到HTTP_REFERER
或建议替代HTTP_REFERER
吗?
答案 0 :(得分:39)
来自文档:
将用户代理引用到的页面地址(如果有) 当前页面。这是由用户代理设置的。并非所有用户代理都会 设置这个,有些提供修改HTTP_REFERER的能力 特征。简而言之,它无法真正被信任。
答案 1 :(得分:28)
当网络浏览器从一个网站移动到另一个网站以及网站的页面之间时,它可以选择传递它来自的网址。这称为HTTP_REFERER,因此,如果您不从一个页面重定向到另一个页面,则可能缺少该页面
如果已设置HTTP_REFERER,则会显示它。如果不是那么你什么都看不到。如果未设置并且您将错误报告设置为显示通知,则会看到类似的错误:
Notice: Undefined index: HTTP_REFERER in /path/to/filename.php
要在通知开启时防止此错误(我总是在通知开启的情况下开发),您可以这样做:
if(isset($_SERVER['HTTP_REFERER'])) {
echo $_SERVER['HTTP_REFERER'];
}
或强>
echo isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
使用$ _SERVER ['HTTP_REFERER']超全局变量将HTTP_REFERER变量用于记录等目的非常有用。然而,重要的是要知道它并不总是这样设置,所以如果您使用通知进行编程,那么您需要在代码中允许这样做
答案 2 :(得分:8)
您可以而且绝不应该假设$_SERVER['HTTP_REFERER']
会出现。
如果您控制上一页,则可以将URL作为参数"site.com/page2.php?prevUrl=".urlencode("site.com/page1.php")
传递。
如果你不控制页面,那么你无能为力。
答案 3 :(得分:6)
Referer不是compulsory header。它可能存在也可能不存在或可能被修改/虚构。依靠它自担风险。无论如何,你应该打包你的电话,这样你就不会得到一个未定义的索引错误:
$server = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
答案 4 :(得分:2)
解决方案
正如其他人很好地指出的那样,HTTP_REFERER是由用户的本地计算机(特别是浏览器)设置的,这意味着它的安全性不可靠。但是,这仍然完全是 Google Analytics(分析)监视您从何处获取访问者的方式,因此,检查,排除,包含等实际上对您很有用。
如果您认为应该看到HTTP_REFERER而没有,请将其添加到您的PHP代码中,最好在顶部:
ini_set('session.referer_check', 'TRUE');
当然,更合适的长期解决方案是实际更新php.ini或等效文件。不过,这是一种不错的快速验证方式。
测试
在您的网站上运行print($_SERVER['HTTP_REFERER']);
,转到google.com,检查一些文本,将其编辑为<a href="https://example.com">LINK!</a>
,应用更改,然后单击链接。如果一切正常,那么一切都很好,并且运行正常!
但是$ _SERVER可能是错误的,或者上面的测试表明它已损坏。以此更新您的页面,然后再次测试...
<script type="text/javascript">
console.log("REFER!" + document.referrer + "|" + location.referrer + "|");
</script>
用途
我使用HTTP REFERER阻止GoogleAnalytics中的垃圾邮件站点。下面的图表着重介绍了一个特定网站的引荐。一天从0到44,这不是真正的用户造成的。这是因为一个受感染的网站试图引起我的注意力来购买他们的服务。但这只是开始,因为php.ini已更新为忽略引荐来源网址,这意味着这些垃圾邮件,垃圾网站没有收到适当的错误403,“访问被拒绝”。
答案 5 :(得分:0)
function redirectHome($theMsg, $url = null, $seconds = 3) {
if ($url === null) {
$url = 'index.php';
$link = 'Homepage';
} else {
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== '') {
$url = $_SERVER['HTTP_REFERER'];
$link = 'Previous Page';
} else {
$url = 'index.php';
$link = 'Homepage';
}
}
echo $theMsg;
echo "<div class='alert alert-info'>You Will Be Redirected to $link After $seconds Seconds.</div>";
header("refresh:$seconds;url=$url");
exit();
}
答案 6 :(得分:-7)
当
$_SERVER['HTTP_REFERER']
失败,请尝试
getenv('HTTP_REFERER')
这可能适合你。