问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php使用nginx如何获取请求头?

发布网友 发布时间:2022-04-06 06:29

我来回答

2个回答

懂视网 时间:2022-04-06 10:50

研究一晚上php关于自定义header头信息的问题。看了很多代码,但是由于本人才疏学浅。连测试demo都没跑通。实在是惭愧。这里看到个获取header信息的方法,挺不错的,记录一下。

我们可以在$_SERVER中获取header数据,自定义的数据都是使用HTTP_作为前缀的,所以可以把HTTP_前缀的数据读出。

public function get_all_header()
 {
 // 忽略获取的header数据。这个函数后面会用到。主要是起过滤作用
 $ignore = array('host','accept','content-length','content-type'); $headers = array(); 
 //这里大家有兴趣的话,可以打印一下。会出来很多的header头信息。
 //咱们想要的部分,都是‘http_'开头的。所以下面会进行过滤输出。
 /* var_dump($_SERVER);
 exit;*/
 foreach($_SERVER as $key=>$value){ if(substr($key, 0, 5)==='HTTP_'){ 
 //这里取到的都是'http_'开头的数据。
 //前去开头的前5位
 $key = substr($key, 5); //把$key中的'_'下划线都替换为空字符串
 $key = str_replace('_', ' ', $key); //再把$key中的空字符串替换成‘-’
 $key = str_replace(' ', '-', $key); //把$key中的所有字符转换为小写
 $key = strtolower($key); //这里主要是过滤上面写的$ignore数组中的数据
 if(!in_array($key, $ignore)){  $headers[$key] = $value;
 }
 }
 }//输出获取到的header
 return $headers;
 }

参考链接:http://blog.csdn.net/fdipzone/article/details/49518535

感谢大家的阅读,希望大家收益多多。

本文转自:https://blog.csdn.net/LJFPHP/article/details/78897951

推荐教程:《php教程》

热心网友 时间:2022-04-06 07:58

Nginx的http模块在处理HTTP请求时对环境变量的封装与Apache有所不同。除了支持一些与HTTP协议相关的通用的变量之外,还支持一系列Nginx自有的变量,如Nginx配置目录下fastcgi_params.default文件里的$server_protocol、$nginx_version等。正如这个文件中的示例的用途,这些变量可以在配置fastcgi时传递给cgi程序,使其可以作为cgi程序的环境变量来使用。然而,即便是Nginx有了这些自有的变量也无法完全满足所有的需求。

了解Jquery的朋友会发现,Jquery在实现Ajax时会通过setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’)方法自动添加一个值为“xmlhttprequest”自定义的请求头”X-Requested-With”来标识这是一个Ajax请求,以期处理这个请求的后端能够通过判断这个标识来识别请求类型。那么这个时候PHP是如何来获取这个自定义参数的值的呢?

熟悉Apache和PHP的人一定会第一时间想到$_SERVER["HTTP_X_REQUESTED_WITH"],不错,这对黄金搭配早就把这个问题给完美解决了,但Nginx却不然,这是由Nginx对其自身工作的定位决定的——Nginx只负责HTTP。在Nginx眼里,PHP只是它的一个后端,形象点来说,它只管分发请求,而不管发给谁。这就意味着,我们无法期待Nginx像Apache一样给我们自动完成一些自定义参数到PHP的传递,只有自力更生。简单点说就是,想要直接像$_SERVER["HTTP_X_REQUESTED_WITH"]这样来调用自定义请求头参数的值的话,你就必须手工将其添加到fastcgi_params的配置中,明确告知cgi程序接收,否则Nginx会将其遗弃。

配置环境变量的方法可参照fastcgi_params.default这个文件,在前面的博客“Nginx下虚拟主机环境变量的配置方法”中也提到过。针对上述例子,只需在fastcgi_params文件中增加一行即可:

?12 # for Ajax fastcgi_param HTTP_X_REQUESTED_WITH $http_x_requested_with;
这样,重载Nginx配置后就可以之间在PHP中调用$_SERVER["HTTP_X_REQUESTED_WITH"]来判断请求类型了。其中需要注意以下两点:

一、自定义请求头部的名称不应该包括空白、冒号、换行和下划线。

Nginx在处理客户端请求header头时,会将名称中的中横线”-”替换为下划线”_”,并将所有字母小写再加上”$http_”来作为该名称对应的变量名。例如上述Jquery的例子中setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’),在HTTP请求头中为一行字符串:”X-Requested-With: xmlhttprequest”,经Nginx处理后将自动生成一个名为$http_x_requested_with的变量,其值为”xmlhttprequest”。尤其注意中横线”-”替换为下划线”_”这个规则,这意味着请求参数名称中如果含有下划线,Nginx将无法正确识别。

二、$_SERVER["HTTP_X_REQUESTED_WITH"]中的索引,也即“fastcgi_param HTTP_X_REQUESTED_WITH $http_x_requested_with;”中加红部分,是可以自由命名的,当前这种命名格式是为了保持和Apache保持一致。
..
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 请问PHP 怎样请求时编写头信息并且还能获得返回的头信息? 如何获取请求的header头信息 PHP如何获取HTTPS响应头headers php 如何获取 客户端http header 如何检验自己的服务器是否支持PHP 怎么查看服务器是否支持https 服务器安装了SSL证书,HTTPS却无法访问 显示:服务器不支持ssl,请检查服务器配置怎么办? http转为https后调用的php网页显示异常 电脑安装软件无法安全连接HTTPS连接? 可能是服务器无法请求https协议 可能未开启curl支持,请尝试开启curl支持,重启web服务器,如果问题仍未解 网站不支持https访问怎么办 PHP 符号 问题 PHP中的符号表示提问!高人指点,说完全点! php如何输出$符号? - PHP进阶讨论 PHP符号问题 PHP函数等或等于应该怎么表达 PHP中的等于号=和== php 不等于判断 PHP中“!==”与“!=”的区别是什么呀?? php中的header函数 如何获取网页的header格式 php的header函数 php获取请求url时响应的报头信息几种方法 php中的header是什么意思 php中header()作用 如何用PHP来取 http header 中的变量 PHP转编码到UTF-8不成功 用php和mysql中文都是乱码,数据库都是繁体字,导出以后都是乱码,页面都是utf8,为什么啊 网站big5码写入数据库出现乱码! php 在apache下缓存文件写入失败 thinkphp腾讯服务器下,缓存文件写入失败,是什么原因? thinkphp 3.0 缓存文件写入失败 xp无任何网络提供程序接受指定的网络路径 windows xp无法访问windows server 2008 r2的共享文件夹,提示无任何网络提供程序接受指定的网络路径, XP访问不同网段的WIN7共享提示“无任何网络提供程序接受指定的网络路径” 运行输IP,提示“无任何网络提供程序接受指定的网络路径”,server 和workstation均已开启。怎么弄? xp局域网共享提示无任何网络提供程序接受指定的网络路径 局域网内打印机共享提示无任何网络提供程序接受指定的网络路径 xp访问win7无任何网络提供程序接受制定的网络路径