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 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
php自动给文章加关键词链接的函数代码
Nov 29 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
PHP连接和操作MySQL数据库基础教程
Sep 29 PHP
浅谈json_encode用法
Mar 05 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
php json中文编码为null的解决办法
Dec 14 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
PHP中md5()函数的用法讲解
Mar 30 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
python 日志增量抓取实现方法
2018/04/28 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
Python __slots__的使用方法
2020/11/15 Python
Oracle的内存结构(Memory structures)
2015/06/10 面试题
工商管理专业实习生自我鉴定
2013/09/29 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
商务经理岗位职责
2014/07/30 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
社区法制宣传月活动总结
2015/05/07 职场文书
关于运动会的广播稿
2015/08/19 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
Nginx代理同域名前后端分离项目的完整步骤
2021/03/31 Servers
Python实现为PDF去除水印的示例代码
2022/04/03 Python