PHP 零基础教程

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访问页面时使用的请求方法(例如:GETPOSTPUT)。
QUERY_STRING访问页面时的查询字符串(如果有的话,即 URL? 后面的部分)。
HTTP_USER_AGENT当前访问页面的用户代理(浏览器/客户端)的信息。
REMOTE_ADDR正在浏览当前页面的用户的 IP 地址。
SCRIPT_FILENAME当前执行脚本的绝对路径名。

3. 执行流程与服务器变量

当客户端发送请求时,Web 服务器会在将控制权交给 PHP 引擎之前,先处理好请求的元数据(metadata)。$_SERVER 就像是一座桥梁,连接了服务器底层的请求处理机制和你的 PHP 业务逻辑。

你可以将整个生命周期理解为以下步骤:

  1. 用户 (User) 发送 HTTP 请求(例如:GET /index.php)。
  2. 服务器 (Server) 接收请求,并自动填充 $_SERVER 数组。
  3. PHP 接管工作,利用 $_SERVER 中的数据执行业务逻辑。
  4. PHP 生成响应结果传回服务器。
  5. 服务器 将最终的 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_AGENTHTTP_REFERER 并将其用于身份验证或关键的安全检查。这些 HTTP 头信息极其容易被恶意的客户端伪造(Spoofing)。请仅仅将它们用于日志记录、数据分析或 UI 适配调整。