PHP实现取得HTTP请求的原文


Posted in PHP onAugust 18, 2014

本文实例讲述了PHP实现取得HTTP请求的原文的方法,具体步骤如下:

1. 取得请求行:Method、URI、协议

可以从超级变量$_SERVER中获得,三个变量的值如下:

$_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n";

2. 取得所有Header

PHP有个内置函数getallheader(),是apache_request_headers()函数的一个别名,可以将HTTP请求的所有Header以数组形式返回。但这个函数只能工作在Apache下,如果换了Nginx或者命令行,会直接报函数不存在的错误。

比较通用的方法是,从超级变量$_SERVER中提取出来,有关Header的键值都是“HTTP_”开头的,可以根据此特点取得所有的Header。

具体代码如下:

function get_all_headers() { 
$headers = array(); 

foreach($_SERVER as $key => $value) { 
if(substr($key, 0, 5) === 'HTTP_') { 
$key = substr($key, 5); 
$key = strtolower($key); 
$key = str_replace('_', ' ', $key); 
$key = ucwords($key); 
$key = str_replace(' ', '-', $key); 

$headers[$key] = $value; 
} 
} 

return $headers; 
}

3. 取得Body

官方提供了一种获取请求Body的方法,即:

file_get_contents('php://input')

4. 最终完整代码如下:

/** 
* 获取HTTP请求原文 
* @return string 
*/ 
function get_http_raw() { 
$raw = ''; 

// (1) 请求行 
$raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n"; 

// (2) 请求Headers 
foreach($_SERVER as $key => $value) { 
if(substr($key, 0, 5) === 'HTTP_') { 
$key = substr($key, 5); 
$key = str_replace('_', '-', $key); 

$raw .= $key.': '.$value."\r\n"; 
} 
} 

// (3) 空行 
$raw .= "\r\n"; 

// (4) 请求Body 
$raw .= file_get_contents('php://input'); 

return $raw; 
}

感兴趣的读者可以调试一下本文所述实例,以加深理解。相信对大家的PHP程序设计有一定的帮助作用。

PHP 相关文章推荐
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 PHP
apache集成php7.3.5的详细步骤
Jun 20 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 #PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 #PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 #PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 #PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 #PHP
mac环境中使用brew安装php5.5.15
Aug 18 #PHP
PHP 正则表达式常用函数
Aug 17 #PHP
You might like
php获取访问者IP地址汇总
2015/04/24 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
js change,propertychange,input事件小议
2011/12/20 Javascript
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
JavaScript数值类型知识汇总
2019/11/17 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
最基础的Python的socket编程入门教程
2015/04/23 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
金融专业毕业生推荐信
2013/11/26 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
计算机科学与技术专业求职信
2014/09/03 职场文书
垂直极限观后感
2015/06/08 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
Django Paginator分页器的使用示例
2021/06/23 Python
Python MNIST手写体识别详解与试练
2021/11/07 Python
python获取带有返回值的多线程
2022/05/02 Python