PHP $_SERVER
$_SERVER 是一个关联数组,包含了由 Web 服务器提供的头信息(headers)、路径(paths)和脚本位置(script locations)。与用户提交的数据(如 $_GET 和 $_POST)不同,这些值是由执行环境本身生成的。你不需要去定义它们;在请求到达你的脚本的那一刻,服务器就会自动填充这个数组。
1. 访问服务器与执行上下文
因为 $_SERVER 是一个超全局变量(superglobal),所以你可以在脚本的任何作用域内直接访问它。它最常用于确定用户是如何访问你的页面的、他们使用的是什么浏览器,或者用于构建在不同开发环境中都能保持兼容的绝对 URL。
<?php
// 检查请求方法(GET 还是 POST)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
echo "表单是通过 POST 方式提交的。";
}
// 获取当前脚本的路径
echo "当前文件:" . $_SERVER['PHP_SELF'];
// 获取访问者的 IP 地址
echo "你的 IP 地址:" . $_SERVER['REMOTE_ADDR'];
?>2. $_SERVER 数组的核心键值
虽然这个数组包含几十个键,但其中大部分是特定于服务器软件(如 Apache 或 Nginx)的。不过,有几个标准的键是你每天开发都会依赖的。
| 键名 (Key) | 描述 (Description) |
|---|---|
| PHP_SELF | 当前正在执行脚本的文件名,相对于网站根目录(document root)。 |
| SERVER_NAME | 当前运行脚本所在的服务器主机的名称。 |
| REQUEST_METHOD | 访问页面时使用的请求方法(例如:GET、POST、PUT)。 |
| QUERY_STRING | 访问页面时的查询字符串(如果有的话,即 URL 中 ? 后面的部分)。 |
| HTTP_USER_AGENT | 当前访问页面的用户代理(浏览器/客户端)的信息。 |
| REMOTE_ADDR | 正在浏览当前页面的用户的 IP 地址。 |
| SCRIPT_FILENAME | 当前执行脚本的绝对路径名。 |
3. 执行流程与服务器变量
当客户端发送请求时,Web 服务器会在将控制权交给 PHP 引擎之前,先处理好请求的元数据(metadata)。$_SERVER 就像是一座桥梁,连接了服务器底层的请求处理机制和你的 PHP 业务逻辑。
你可以将整个生命周期理解为以下步骤:
- 用户 (User) 发送 HTTP 请求(例如:
GET /index.php)。 - 服务器 (Server) 接收请求,并自动填充
$_SERVER数组。 - PHP 接管工作,利用
$_SERVER中的数据执行业务逻辑。 - PHP 生成响应结果传回服务器。
- 服务器 将最终的 HTML 输出发送给用户。
4. 实战应用:保护表单提交
$_SERVER 的一个常见应用场景是强制执行安全策略或路由规则。例如,你可以使用 $_SERVER['HTTP_REFERER'] 来确保请求是从你网站上的某个特定页面发出的;或者使用 $_SERVER['REQUEST_METHOD'] 来防止用户通过在浏览器地址栏直接输入 URL 来意外触发数据处理脚本。
<?php
// 防止直接访问数据处理脚本
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
die("不允许直接访问。请通过提交表单来访问此页面。");
}
// 确保用户来自你指定的联系人页面
$expected_referer = "https://example.com/contact.php";
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== $expected_referer) {
die("安全违规:无效的来源。");
}
echo "正在安全地处理你的数据...";
?>安全警告: 绝对不要信任HTTP_USER_AGENT或HTTP_REFERER并将其用于身份验证或关键的安全检查。这些 HTTP 头信息极其容易被恶意的客户端伪造(Spoofing)。请仅仅将它们用于日志记录、数据分析或 UI 适配调整。