
本文详解在 delphi 中通过 tidhttp 或 thttpclient 发送带自定义 header 的 get 请求时,为何 php 端无法通过 `$_get['test']` 获取值,并明确区分 http header 与 url 查询参数的本质差异,提供可立即生效的修复方案。
在实际开发中,一个常见误区是混淆 HTTP 请求头(Headers) 与 URL 查询参数(Query Parameters)。你代码中调用 Request.CustomHeaders.AddValue('test', 'text') 确实成功发送了一个名为 test 的自定义请求头,但 PHP 的 $_GET 超全局数组仅解析 URL 中 ? 后的查询字符串(如 ?test=text),完全不读取任何 HTTP 头字段。因此,$_GET['test'] 始终为空,导致输出 0 并触发 Undefined index 警告。
✅ 正确做法一:若需传递业务参数 → 使用 URL 查询参数
这是最常用、最兼容的方式。修改 Delphi 客户端,将参数拼入 URL:
// 使用 TIdHTTP
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
Memo1.Text := IdHTTP1.Get('https://example.com/?test=text');
// 使用 THTTPClient
Memo1.Text := NetHTTPClient1.Get('https://example.com/?test=text').ContentAsString;对应 PHP 端保持原样即可:
✅ 正确做法二:若确需读取自定义 Header → 从 $_SERVER 获取
HTTP 头字段(如 test: text)在 PHP 中统一存于 $_SERVER 数组,且键名会自动转换为大写并以 HTTP_ 为前缀(连字符 - 替换为下划线 _)。因此,Header test 应通过 $_SERVER['HTTP_TEST'] 访问:
⚠️ 重要注意事项:
- Apache 默认会过滤掉非标准 Header(如 test),需在服务器配置中显式启用:
在 .htaccess 或虚拟主机配置中添加:SetEnvIfNoCase ^test$ ^.*$ test=$0
或更通用的方案(推荐):
RewriteEngine On RewriteCond %{HTTP:test} ^(.+)$ RewriteRule .* - [E=HTTP_TEST:%1] - Nginx 用户需在 location 块中添加:
fastcgi_param HTTP_TEST $http_test;
- 浏览器发起的跨域 AJAX 请求中,自定义 Header(如 test)会触发预检(OPTIONS),需服务端正确响应 CORS 头(Access-Control-Allow-Headers: test)。
总结
| 目标 | 客户端操作 | PHP 端获取方式 |
|---|---|---|
| 传递业务参数 | 拼接 URL:?key=value | $_GET['key'] |
| 传递元数据/认证信息 | 设置 Header:CustomHeaders.Add('key','value') | $_SERVER['HTTP_KEY'] |
切勿期望 $_GET 读取 Header —— 这是协议层级的根本区别。根据实际需求选择参数传递路径,才能确保前后端通信准确无误。










