学到PHP的超级全局变量时,遇到了PHP $_SERVER['HTTP_REFERER'],不料在phpstorm中运行的到如下结果:
<?php
$x=5;
$y=10;
function addtion(){
$GLOBALS["z"]=$GLOBALS["x"]+$GLOBALS["y"];/** $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
* $GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。*/
}
addtion();
echo $z."<br>";
var_dump ($z);
echo "<br>";
/**
* $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。
* 不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
* 以下实例中展示了如何使用$_SERVER中的元素:
*/
echo $_SERVER["PHP_SELF"]."<br>";
echo $_SERVER["SERVER_NAME"]."<br>";
echo $_SERVER["HTTP_HOST"]."<br>";
echo $_SERVER["HTTP_REFERER"]."<br>";
echo $_SERVER["HTTP_USER_AGENT"]."<br>";
echo $_SERVER["SCRIPT_NAME"]."<br>";
我们知道,它得到的是:引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。),也就是说,用户代理(浏览器)可能更改了它,也可能是当前页没有前一页(这个意思就是说当前页是点击前一页(来源页面)中的链接得来的,我觉得最可能是这个,毕竟我是用phpstorm运行滴,后面我证实了确实是这样,解决方法在最下面的博客链接里)。
查阅得知:它无效还可能是以下几种情况。这几种情况源自https://www.cnblogs.com/caicaizi/p/6053890.html
PHP $_SERVER['HTTP_REFERER'] 无效
需要注意的是,$_SERVER['HTTP_REFERER'] 完全来源于浏览器。并不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,$_SERVER['HTTP_REFERER'] 不总是真实正确的。
通常下面的一些方式,$_SERVER['HTTP_REFERER'] 会无效:
- 直接输入网址访问该网页。
- Javascript 打开的网址。
- Javascript 重定向(window.location)网址。
- 使用 meta refresh 重定向的网址。
- 使用 PHP header 重定向的网址。
- flash 中的链接。
- 浏览器未加设置或被用户修改。
所以一般来说,只有通过 <a></a> 超链接以及 POST 或 GET 表单访问的页面,$_SERVER['HTTP_REFERER'] 才有效。
由于 $_SERVER['HTTP_REFERER'] 对 POST 表单访问也是有效的,因此在表单数据处理页面一定程度上可以通过校验 $_SERVER['HTTP_REFERER'] 来防止表单数据的恶意提交。但该方法并不能保证表单数据的绝对正确,即对表单数据的真实性检测并不能完全依赖于 $_SERVER['HTTP_REFERER'] 。
注意!!!
这个问题我可能已经解决了,详见我的这篇博客后面突然就想明白了:https://blog.csdn.net/doubleguy/article/details/90166275