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 动态添加记录
Mar 10 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
php木马webshell扫描器代码
Jan 25 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
php获取网页上所有链接的方法
Apr 03 PHP
微信access_token的获取开发示例
Apr 16 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
Feb 15 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 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
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
node.js-v6新版安装具体步骤(分享)
2017/09/06 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
python中eval与int的区别浅析
2019/08/11 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
技校生自我鉴定范文
2013/09/26 职场文书
三年级小学生评语
2014/04/22 职场文书
岳麓书院导游词
2015/02/03 职场文书
2015年质检工作总结
2015/05/04 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
利用python做表格数据处理
2021/04/13 Python
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
DE1107机评
2022/04/05 无线电