Practical PHP Programming

预设变量

在你开始写你的代码之前,PHP已经给你定义了一些关于服务器、关于环境以及来自访问者请求的变量。这些都存储在超全局变量当中,你可以通过phpinfo()函数将其输出。

下面是保存在$_SERVER当中最常使用的变量:

变量名 取值
HTTP_REFERER 如果用户通过点击链接访问当前页面,则为链接过来的url地址;如果用户直接访问,则为空值。
HTTP_USER_AGENT 用户浏览器设定的值。
PATH_INFO 网址中文件名后面部分传递的数据。
PHP_SELF 当前文件名。
REQUEST_METHOD GET或POST。
QUERY_STRING GET请求中问号之后的所有字符串。

注意是HTTP_REFERER而不是HTTP_REFERRERreferer正确英语拼法是referrer,由于早期HTTP规范的拼写错误,为了保持向后兼容而将错就错。

在上面的变量当中,最重要的是HTTP_REFERERHTTP_AGENT,通过他们,你可以知道你访客的一些信息,并做出相应的动作:

<?php
    if (isset($_SERVER['HTTP_REFERER'])) {
        print "The page you were on previously was {$_SERVER['HTTP_REFERER']}<br />";
    } else {
        print "You didn't click any links to get here<br />";
    }
?>

<a href="refer.php">Click me!</a>

当你在浏览器当中手动输入URL的时候,由于HTTP_REFERER未设置,因此会输出“You didn't click any links to get here”。然而,如果你通过下面的“Click me!”点击重新加载了该页面,就会显示不同的东西了。虽然这样显得有点滑稽,HTTP_REFERER通常用来判断访客来源,不管你是不是使用这个来显示“对不起,由于您来自外站,不能直接下载本站文件”或“欢迎来自Google的朋友”,这都提供了一种思路。

$_SERVER当中的PATH_INFO元素很有意思,因为你可以在加载代码之后获取到路径信息,例如:

 <?php
    if (isset($_SERVER['PATH_INFO'])) {
        print "The page you requested was {$_SERVER['PATH_INFO']}<br />";
    } else {
        print "You didn't request a page<br />";
    }
?>

保存为pathinfo.php之后放到网站目录下,从浏览器当中加载,你应该看到“You didn't request a page”。现在,在地址栏的“pathinfo.php”后加入一个路径信息,例如www.yoursite.com/pathinfo.php/path/to/some/file.txt,回车后,就能看到后面的路径信息加载出来了。这个在在线文件系统当中很常用,在URL中告诉脚本你想要哪个文件。

作者说明:由于参考信息是浏览器设置的,也就意味着这个很容易被假冒。一个例子就是更改你电脑上的“hosts”文件,将随便一个域名指向本地,例如example.com,之后,黑客从他的电脑上设置的链接跳转到你的脚本,你的脚本就会提示他来自example.com。所以,作为一个好的开始,你不应该依赖并信任HTTP_REFERER中的值。