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 ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
php抓取页面的几种方法详解
Jun 17 PHP
解析MySql与Java的时间类型
Jun 22 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
PHP实现在线阅读PDF文件的方法
Jun 23 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
对laravel in 查询的使用方法详解
Oct 09 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 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
咖啡与水的关系
2021/03/03 冲泡冲煮
php中Smarty模板初体验
2011/08/08 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
Ajax和PHP正则表达式验证表单及验证码
2016/09/24 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
js尾调用优化的实现
2019/05/23 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
python进阶教程之文本文件的读取和写入
2014/08/29 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python requests post多层字典的方法
2018/12/27 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
提升python处理速度原理及方法实例
2019/12/25 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
装修公司工程部经理岗位职责
2015/04/09 职场文书
红色革命电影观后感
2015/06/18 职场文书