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 date()日期时间函数详解
May 16 PHP
php mysql_real_escape_string函数用法与实例教程
Sep 30 PHP
php二维数组用键名分组相加实例函数
Nov 06 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
php中使用GD库做验证码
Mar 31 PHP
各种快递查询--Api接口
Apr 26 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
轻松实现php文件上传功能
Feb 17 PHP
PHP使用GD库制作验证码的方法(点击验证码或看不清会刷新验证码)
Aug 15 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Python 文件和输入输出小结
2013/10/09 Python
Python Requests库基本用法示例
2018/08/20 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
师范学院教师自荐书
2014/01/31 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
贷款担保申请书
2014/05/20 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
人事局接收函
2015/01/31 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
离婚代理词范文
2015/05/23 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python
Golang bufio详细讲解
2022/04/21 Golang