最可靠的方式是读取$_SERVER['REQUEST_METHOD'],它由Web服务器注入、大小写规范且不依赖框架或重写规则;getenv()不可靠,CLI模式下该值为空,需防御性检查。

PHP获取HTTP请求方法最可靠的方式是读取 $_SERVER['REQUEST_METHOD'],它直接来自SAPI层,不依赖任何框架或重写规则,且大小写规范(如 GET、POST、PUT、DELETE)。
为什么不用 $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] 或自定义 header?
某些前端库(如旧版 AngularJS)或代理会用 X-HTTP-Method-Override 声称“模拟”非标准方法,但这只是客户端约定,不是真实请求方法。PHP本身不解析或应用该 header —— 它只是原始字符串,需手动判断并覆盖逻辑,容易引入安全漏洞(比如未校验来源就盲信该 header)。真实方法始终以 $_SERVER['REQUEST_METHOD'] 为准,其他都是辅助或兼容手段。
$_SERVER['REQUEST_METHOD'] 在 CLI、FastCGI、Apache 和 Nginx 下都可用吗?
是的,只要运行在 Web SAPI 模式下(如 apache2handler、fpm-fcgi、cgi),$_SERVER['REQUEST_METHOD'] 就由 Web 服务器注入,与底层协议无关。但在 CLI 模式下(如执行 php script.php)该值不存在或为空,此时访问会触发 undefined index 警告。实际使用时应做防御性检查:
$method = $_SERVER['REQUEST_METHOD'] ?? 'CLI'; // 避免 Notice
if (!in_array(strtoupper($method), ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'])) {
http_response_code(405);
exit('Method not allowed');
}
用 getenv('REQUEST_METHOD') 替代可以吗?
不推荐。虽然在部分环境(如 Apache mod_php)下有效,但 getenv() 行为受 variables_order 和 php.ini 配置影响,在 FPM + Nginx 组合中常返回 false 或空字符串。而 $_SERVER 是 PHP 内建超全局数组,由 SAPI 显式填充,稳定性高得多。唯一例外是极简嵌入式环境(如某些微服务容器),但那种场景通常已脱离传统 HTTP 请求上下文。
立即学习“PHP免费学习笔记(深入)”;
真正容易被忽略的是:当使用 URL 重写(如 Apache 的 RewriteRule 或 Nginx 的 try_files)把所有请求转发给 index.php 时,$_SERVER['REQUEST_METHOD'] 仍保持原始值,不会因路由转发而改变 —— 这正是它可靠的原因。别试图从 $_SERVER['QUERY_STRING'] 或请求体里反推方法,那是在给自己埋坑。



















