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 相关文章推荐
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
ThinkPHP中redirect用法分析
Dec 05 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
php中Ioc(控制反转)和Di(依赖注入)
May 07 PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 PHP
PHP使用CURL实现下载文件功能示例
Jun 03 PHP
yii2 在控制器中验证请求参数的使用方法
Jun 19 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 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
虫族 ZERG 概述
2020/03/14 星际争霸
博士208HAF收音机实习报告
2021/03/02 无线电
同时提取多条新闻中的文本一例
2006/10/09 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
python通过邮件服务器端口发送邮件的方法
2015/04/30 Python
Python实现图像几何变换
2015/07/06 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
python中元组的用法整理
2020/06/15 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
教师岗位职责范本
2013/12/29 职场文书
《荷花》教学反思
2014/04/16 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Win11 BitLocker 驱动器加密
2022/04/19 数码科技