乐趣区

PHP 的 $_SERVER详解

导语
$_SERVER 是 PHP 预定义的超全局变量。所谓“超全局变量”,即在脚本全部作用域中都可以使用,$_SERVER 保存关于报头、路径和脚本位置的信息。工作中经常忘记,在此整理记录下,加深印象。测试是在 Windows 下进行的,环境为 Apache/2.4.23 (Win32)+PHP/5.6.27-nts,访问域名为 http://www.example.com/index….,文件目录在 E:/WWW/example/。
主要内容详解

$_SERVER[“SCRIPT_NAME”] => “/index.php”,当前脚本路径
$_SERVER[“REQUEST_URI”] => “/index.php?id=1″,访问的页面 URI,包含查询字符串
$_SERVER[“QUERY_STRING”] => “id=1″,查询字符串,不存在为 ” ”
$_SERVER[“REQUEST_METHOD”] => “GET”,请求方法,如 ”POST”、”PUT” 等
$_SERVER[“SERVER_PROTOCOL”] => “HTTP/1.1″,通信协议的名称和版本
$_SERVER[“GATEWAY_INTERFACE”] => “CGI/1.1″,服务器使用的 CGI 规范的版本
$_SERVER[“REMOTE_PORT”] => “60599”,用户连接服务器使用的端口
$_SERVER[“SCRIPT_FILENAME”] => “E:/WWW/example/index.php”,当前脚本的绝对路径
$_SERVER[“DOCUMENT_ROOT”] => “E:/WWW/example/”,当前脚本文档根目录的绝对路径
$_SERVER[“REMOTE_ADDR”] => “127.0.0.1”,用户的 IP 地址
$_SERVER[“SERVER_PORT”] => “80”,服务器使用的端口
$_SERVER[“SERVER_ADDR”] => “127.0.0.1”,服务器的 IP 地址
$_SERVER[“SERVER_NAME”] => “www.example.com”,服务器的主机名,注:如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。在 Apache 2 里,必须设置 UseCanonicalName = On 和 ServerName。否则该值会由客户端提供,就有可能被伪造。上下文有安全性要求的环境里,不应该依赖此值。

$_SERVER[“SERVER_SOFTWARE”] => “Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9″,响应头中 Server 的内容
$_SERVER[“SERVER_SIGNATURE”] => “”,包含了服务器版本和虚拟主机名的字符串
$_SERVER[“HTTP_HOST”] => “www.example.com”,请求头中 Host 项的内容
$_SERVER[“HTTP_CONNECTION”] => “keep-alive”,请求头中 Connection 项的内容
$_SERVER[“HTTP_PRAGMA”] => “no-cache”,请求头中 Pragma 项的内容
$_SERVER[“HTTP_CACHE_CONTROL”] => “no-cache”,请求头中 Cache-Control 项的内容
$_SERVER[“HTTP_UPGRADE_INSECURE_REQUESTS”] => “1”,请求头中 Upgrade-Insecure-Requests 项的内容
$_SERVER[“HTTP_USER_AGENT”] => “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36″,请求头中 User-Agent 项的内容
$_SERVER[“HTTP_ACCEPT”] => “text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8″,请求头中 Accept 项的内容
$_SERVER[“HTTP_ACCEPT_ENCODING”] => “gzip, deflate”,请求头中 Accept-Encoding 项的内容
$_SERVER[“HTTP_ACCEPT_LANGUAGE”] => “zh-CN,zh;q=0.8″,请求头中 Accept-Language 项的内容
$_SERVER[“PHP_SELF”] => “/index.php”,当前执行脚本的文件名
$_SERVER[“REQUEST_TIME_FLOAT”] => 1510112348.8084,请求开始的时间戳,微秒级别精准度
$_SERVER[“REQUEST_TIME”] => 1510112348,请求开始的时间戳

实例
以上是测试中的 $_SERVER 的主要内容,根据不同的环境配置,会有些变化。在实际工作中,$_SERVER 有很多作用,这里只举两个简单实例,获取当前请求 URL 以及简单防盗链
<?php
// $_SERVER[‘HTTPS’] 当前是否为 HTTPS 协议
if (!empty($_SERVER[‘HTTPS’]) && strtolower($_SERVER[‘HTTPS’]) !== ‘off’) {
$url = ‘https://’;
} else {
$url = ‘http://’;
}

if ($_SERVER[‘SERVER_PORT’] == 80) {
$url .= $_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];
} else {
$url .= $_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’].$_SERVER[‘SERVER_PORT’];
}
<?php
// $_SERVER[‘HTTP_REFERER’],前一页面的 url
if (!empty($_SERVER[‘HTTP_REFERER’])) {
if (!strpos($_SERVER[‘HTTP_REFERER’], ‘www.example.com’)) {
header(‘Location: http://www.example.com’);
}
}

参考资料:PHP 手册、HTTP 消息头

退出移动版