获取请求 header 中指定字段的值
1 private function getHeader($name) {//获取请求头中$name的值 2 $name = 'HTTP_' . $name; 3 foreach ($_SERVER as $key => $value) { 4 if($key == $name) { 5 return $value; 6 } 7 } 8 return null; 9 }
若指定字段不存在则返回 null
需要特别注意的是,如果我们是用 nginx 提供反向代理服务,则需要在 nginx.conf 中将 underscores_in_headers 设置成 on (如图)才能在请求的 headers 中带自定义带下划线的字段,否则 headers 中的自定义带下划线字段会丢失。
例:
1 $header = array('token:JxRaZezavm3HXM3d9pWnYiqqQC1SJbsU','language:zh','region:GZ', 'user:xiao01', 'AMIS_USER:xiao01'); 2 3 $content = array( 4 'name' => 'fdipzone' 5 ); 6 7 echo tocurl($api, $header, $content); 8 9 /** 10 * 发送数据 11 * @param String $url 请求的地址 12 * @param Array $header 自定义的header数据 13 * @param Array $content POST的数据 14 * @return String 15 */ 16 function tocurl($url, $header, $content){ 17 $ch = curl_init(); 18 if(substr($url,0,5)=='https'){ 19 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 20 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在 21 } 22 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 23 curl_setopt($ch, CURLOPT_URL, $url); 24 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 25 curl_setopt($ch, CURLOPT_POST, true); 26 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($content)); 27 $response = curl_exec($ch); 28 if($error=curl_error($ch)){ 29 die($error); 30 } 31 curl_close($ch); 32 return $response; 33 }
若没有将 nginx.conf 中的 underscores_in_headers 为 on 的话,nginx 不会将 header 中的 AMIS_USER 字段传到我们的后端接口中,也就无法用上面的 getHeader 获取到 AMIS_USER 字段的值了。
$header = array('token:JxRaZezavm3HXM3d9pWnYiqqQC1SJbsU','language:zh','region:GZ', 'user:xiao01', 'AMIS_USER:xiao01');
$content = array( 'name' => 'fdipzone');
echo tocurl($api, $header, $content);
/** * 发送数据 * @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;}