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和XSL stylesheets转换XML文档
Oct 09 PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
destoon设置自定义搜索的方法
Jun 21 PHP
浅析php原型模式
Nov 25 PHP
php建立Ftp连接的方法
Mar 07 PHP
php从数据库查询结果生成树形列表的方法
Apr 17 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
PHP实现根据密码长度显示安全条
Jul 04 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
php cookis创建实现代码
2009/03/16 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
php数组删除元素示例
2014/03/21 PHP
php数组添加元素方法小结
2014/12/20 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
Js 获取Gridview选中行的内容操作步骤
2013/02/05 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
python散点图实例之随机漫步
2018/08/27 Python
python try except 捕获所有异常的实例
2018/10/18 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
对python模块中多个类的用法详解
2019/01/10 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
创先争优宣传标语
2014/10/08 职场文书
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python