PHP如何获取Header信息

kyle315 2016-01-05 06:55:23
我使用curl模拟Http Post请求,并在请求中加入了自定义的header,但我在服务端死活获取不到这个header(sign和Authorization),使用的Apache服务器,各位大神看看问题出在哪里,代码如下:
client.php
<?php
header('Content-type: text/json;charset=utf-8');
$url="http://127.0.0.1/server1.php";
$post=true;

$body=array(
"mobile" => "13600000000",
"exp" => time()
);
$body_json = json_encode($body);

$header=array(
"sign" => "signature",
"Authorization" => "OH key:signature"
);

$ch = curl_init();
//参数设置
$res= curl_setopt ($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);

if($post)
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_json);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);

$result = curl_exec ($ch);
echo $result;
curl_close($ch);
?>

server.php
<?php
header('Content-type: text/json;charset=utf-8');

$body=file_get_contents("php://input");
echo "<br>body:".$body;

var_dump($_SERVER);
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
$arh = array();
$rx_http = '/\AHTTP_/';
foreach($_SERVER as $key => $val) {
if( preg_match($rx_http, $key) ) {
$arh_key = preg_replace($rx_http, '', $key);
$rx_matches = array();
// do some nasty string manipulations to restore the original letter case
// this should work in most cases
$rx_matches = explode('_', $arh_key);
if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
$arh_key = implode('-', $rx_matches);
}
$arh[$arh_key] = $val;
}
}
return( $arh );
}
///
}
var_dump(apache_request_headers(void)) ;

?>
...全文
2247 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen519 2016-01-07
  • 打赏
  • 举报
回复
这个 问题还没有看懂 以后回来再看
kyle315 2016-01-06
  • 打赏
  • 举报
回复
上面的方法传递其它header值都没问题,但是传递 "Authorization" => "Authorization:keysignature"却无法获取到Authorization的值,是不是Authorization的header有特殊限制?看到一个方法可以取(http://blog.csdn.net/phphot/article/details/3491295),但还是取不到,高人们看下是什么原因。
李睿_Lee 2016-01-06
  • 打赏
  • 举报
回复
引用 6 楼 kyle315 的回复:
上面的方法传递其它header值都没问题,但是传递 "Authorization" => "Authorization:keysignature"却无法获取到Authorization的值,是不是Authorization的header有特殊限制?看到一个方法可以取(http://blog.csdn.net/phphot/article/details/3491295),但还是取不到,高人们看下是什么原因。
文章中写得很明白了,Authorization这个确实比较特殊,具体的,其实你只要把$_SERVER变量整个打印出来看看,看Authorization这个键最终变成什么样的,就清楚是不是文章中写的那样了。
傲雪星枫 2016-01-05
  • 打赏
  • 举报
回复
之前写了类似的,可以参考一下:http://blog.csdn.net/fdipzone/article/details/49518535 发送header:

<?php
$url = 'http://www.example.com';
$header = array('token:JxRaZezavm3HXM3d9pWnYiqqQC1SJbsU','language:zh','region:GZ');
$content = array(
        'name' => 'fdipzone'
);

$response = tocurl($url, $header, $content);
$data = json_decode($response, true);

echo 'POST data:';
echo '<pre>';
print_r($data['post']);
echo '</pre>';
echo 'Header data:';
echo '<pre>';
print_r($data['header']);
echo '</pre>';

/**
 * 发送数据
 * @param String $url     请求的地址
 * @param Array  $header  自定义的header数据
 * @param Array  $content POST的数据
 * @return String
 */
function tocurl($url, $header, $content){
    $ch = curl_init();
    if(substr($url,0,5)=='https'){
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);  // 从证书中检查SSL加密算法是否存在
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($content));
    $response = curl_exec($ch);
    if($error=curl_error($ch)){
        die($error);
    }
    curl_close($ch);
    return $response;
}
?>
接收header

<?php
$post_data = $_POST;
$header = get_all_headers();

$ret = array();
$ret['post'] = $post_data;
$ret['header'] = $header;

header('content-type:application/json;charset=utf8');
echo json_encode($ret, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);

/**
 * 获取自定义的header数据
 */
function get_all_headers(){

    // 忽略获取的header数据
    $ignore = array('host','accept','content-length','content-type');

    $headers = array();

    foreach($_SERVER as $key=>$value){
        if(substr($key, 0, 5)==='HTTP_'){
            $key = substr($key, 5);
            $key = str_replace('_', ' ', $key);
            $key = str_replace(' ', '-', $key);
            $key = strtolower($key);

            if(!in_array($key, $ignore)){
                $headers[$key] = $value;
            }
        }
    }

    return $headers;

}
?> 
输出:

POST data:
Array
(
    [name] => fdipzone
)
Header data:
Array
(
    [token] => JxRaZezavm3HXM3d9pWnYiqqQC1SJbsU
    [language] => zh
    [region] => GZ
)
xuzuning 2016-01-05
  • 打赏
  • 举报
回复
其实你那样写也是很不错的,结构清晰! $header=array( "sign" => "signature", "Authorizatio" => "signature" ); 但不能忘了这句(格式化一下) foreach($header as $k=>&$v) $v = "$k:$v";
xuzuning 2016-01-05
  • 打赏
  • 举报
回复
$header=array( "sign" => "sign:signature", "Authorization" => "Authorizatio:signature" ); 就有 [HTTP_SIGN] => signature [HTTP_AUTHORIZATIO] => signature 应该是键超长了吧
kyle315 2016-01-05
  • 打赏
  • 举报
回复
@xuzuning 版主爱死你了,确实是这个问题改过之后就可以取到了,但是我写成 $header=array( "sign" => "sign:signature", "Authorization" => "Authorization:keysignature" ); 却娶不到Authorization的值,怎么破?
xuzuning 2016-01-05
  • 打赏
  • 举报
回复
是谁教你那么写 header 的? $header=array( "sign" => "sign:signature", "Authorization" => "OH key:signature" ); $_SERVER 中才会有 [HTTP_SIGN] => signature [HTTP_OH_KEY] => signature 项 可见关联键是没有作用的
MySQL 教程MySQL 是流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成databaseRDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。MySQL数据库MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 是开源的,目前隶属于 Oracle 旗下产品。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。MySQL 对PHP有很好的支持,PHP 是目前流行的 Web 开发语言。MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。Redis 教程REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧