跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何在 PHP 中正确处理 HTTP 自定义请求头与 GET 参数

本文详解 http 请求中自定义 header 与 url 查询参数(get)的本质区别,指出常见混淆误区,并提供 delphi 客户端发送方式及 php 服务端对应的正确接收方案。 在开发中,一个高频误区是: 误将 HTTP 请求头(Header)当作 $_GET 变量来访问 。例如,你用 TIdHTTP 或 THTTPClient 设置了自定义头 test: text,却在 PHP 中写 $_GET['test'] 判断——这必然失败,因为 $_GET 只解析 URL 查询字符串(query string)中的键值对 ,而自定义 Header 存储在 $_SERVER 超全局数组中,且需遵循特定命名规范。 ✅ 正确区分两种数据传递方式 传递方式客户端示例(Delphi)PHP 接收方式对应 URL 示例GET 参数(查询参数)IdHttp1.Get('https://example.com?test=text');$_GET['test'] → 'text'https://example.com?test=text自定义 HTTP HeaderIdHttp1.Request.CustomHeaders.AddValue('X-Test', 'text');$_SERVER['HTTP_X_TEST'] → 'text'(URL 不变,仅 Header 携带) ⚠️ 注意:PHP 将 Header 名自动转换为 HTTP_ 前缀 + 大写 + 下划线格式(连字符 - 和空格均转为 _)。原始 Header X-Test → $_SERVER['HTTP_X_TEST'];My-Custom-Header → $_SERVER['HTTP_MY_CUSTOM_HEADER']。 ✅ Delphi 客户端代码修正(以 TIdHTTP 为例)
procedure TForm1.Button1Click(Sender: TObject); begin // ✅ 方式1:发送 GET 参数(推荐用于简单传参) Memo1.Text := IdHttp1.Get('https://example.com?test=text'); // ✅ 方式2:发送自定义 Header(适用于认证、追踪等元信息) IdHttp1.Request.CustomHeaders.Clear; IdHttp1.Request.CustomHeaders.AddValue('X-Test', 'text'); // 注意使用标准前缀如 X- Memo1.Text := IdHttp1.Get('https://example.com'); end;
✅ PHP 服务端对应接收逻辑
❗ 关键注意事项 不要直接访问 $_SERVER['test'] :PHP 不会将原始 Header 名原样映射到 $_SERVER,必须加 HTTP_ 前缀并转为大写下划线格式。 Header 名建议加 X- 前缀 :符合历史惯例(如 X-Requested-With),避免与标准 Header 冲突;现代 API 也倾向使用 X- 或无前缀但明确约定(如 Authorization)。 Apache 配置影响 :某些 Apache 配置(如 mod_security 或 RewriteRule)可能过滤或重写 Header,若 $_SERVER['HTTP_*'] 为空,请检查服务器日志及 .ht access 。 CORS 与预检请求 :若 前端 JS 发送自定义 Header,需后端显式允许(如 Access-Control-Allow-Headers: X-Test),否则 浏览器 会拦截。 ✅ 总结 $_GET ≠ HTTP Header:前者来自 URL 查询字符串,后者来自请求头字段; Delphi 中 CustomHeaders.AddValue() 设置的是 Header,不是 GET 参数; PHP 中读取自定义 Header 必须通过 $_SERVER['HTTP_XXX'],且命名需严格匹配转换规则; 根据业务场景选择合适方式: 业务参数走 GET/POST,元数据/控制信息走 Header 。 掌握这一区分,可避免大量“参数收不到”的调试陷阱,提升前后端协作效率。 Comet AI 浏览器 下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。 下载

相关文章