AJAX 请求区分 $_SERVER['HTTP_X_REQUESTED_WITH'] 小解
关于这个内容,很多人都有所了解。但从我搜索的内容来看,他们只是略微看一下,根本不知道里面到底是什么情况。
受到很多模版代码的影响,大家都以为PHP有这样一个自定义变量:$_SERVER['HTTP_X_REQUESTED_WITH'], 其实根本不是那么回事。
$_SERVER是一个包含诸如头信息(header),路径(path)和脚本位置(script locations)的数组。这是PHP手册的原话。
有 一些头信息是系统本身就存在的,且不能更改,比如说HOST,USER_AGENT等等,注意我们常用到的 是$_SERVER['HTTP_HOST'],$_SERVER['HTTP_USER_AGENT'],这里面都有HTTP前缀,实现上在 header信息里面是没有HTTP前缀的,信息名称只是HOST之类的,$_SERVER自动的为他们加上HTTP前缀,一是为了防止与本身的其它信息 相冲突,二是为了表示他们是header头部的信息。所以$_SERVER中的变量凡是带有HTTP前缀的均是header信息,没有的则不是, 如:$_SERVER['QUERY_STRING'],$_SERVER['PHP_SELF']等。
用户可以创建自定义的header头部信息,并把这些信息发送给服务器端, 服务器端就会记录这些header信息,并把他们存储到$_SERVER变量中,当然实现的变量名称变成了"HTTP_"连上用户的变量名称。比如上面的 判断ajax请求。实际上是在向服务器发送异步请求之前,向header中加入一条header信息,实际的语句应该是:
HttpRequest 对象.setRequestHeader("X_REQUESTED_WITH", "任意字符串");
服务器端通 过$_SERVER['HTTP_X_REQUESTED_WITH']这个变量是否存在,或具体的值来判断是否是ajax请求或具体是哪一条ajax请 求。 所以利用这个不但可以验证请求是否是ajax请求,还可以获取更多的信息。
同样我们可以在header中任意设置其它的信息,用于跟服务器端进行数据交流。比 如:
xmlHttpRequest.setRequestHeader("test", "just a test");
那么被请求的服务器页面中的变量$_SERVER['HTTP_TEST']的值就是"just a test";注意这里面前面的test不固定大小写。后面的$_SERVER['HTTP_TEST']必须是大写。
顺便把执行一下如下代码:
<?php
print_r($_SERVER);
?>
输出:
Array
(
[MIBDIRS] => D:/php/xampp/php/extras/mibs
[MYSQL_HOME] => xamppmysqlin
[OPENSSL_CONF] => D:/php/xampp/apache/bin/openssl.cnf
[PHP_PEAR_SYSCONF_DIR] => xamppphp
[PHPRC] => xamppphp
[TMP] => xampp mp
[HTTP_HOST] => wenjb
[HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0
[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
[HTTP_ACCEPT_LANGUAGE] => zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_CONNECTION] => keep-alive
[HTTP_CACHE_CONTROL] => max-age=0
[PATH] => C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;D:Program FilesTortoiseSVNin;D:Program FilesSSH Secure Shell
[SystemRoot] => C:WINDOWS
[COMSPEC] => C:WINDOWSsystem32cmd.exe
[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
[WINDIR] => C:WINDOWS
[SERVER_SIGNATURE] => <address>Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1 Server at wenjb Port 80</address> [SERVER_SOFTWARE] => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
[SERVER_NAME] => wenjb
[SERVER_ADDR] => 10.10.24.170
[SERVER_PORT] => 80
[REMOTE_ADDR] => 10.10.24.170
[DOCUMENT_ROOT] => D:/php/xampp/htdocs
[SERVER_ADMIN] => postmaster@localhost
[SCRIPT_FILENAME] => D:/php/xampp/htdocs/cbs/src/ws_cbs/wjbphp.php
[REMOTE_PORT] => 1675
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /cbs/src/ws_cbs/wjbphp.php
[SCRIPT_NAME] => /cbs/src/ws_cbs/wjbphp.php
[PHP_SELF] => /cbs/src/ws_cbs/wjbphp.php
[REQUEST_TIME] => 1336816781
)
AJAX 请求区分 $_SERVER['HTTP_X_REQUESTED_WITH'] 小解的更多相关文章
- PHP判断ajax请求:HTTP_X_REQUESTED_WITH
PHP判断ajax请求的原理: 在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的 header头信息, 在jquery框架中,对于通过它的$.ajax, $.g ...
- PHP判断请求是否是ajax请求
首先看一下框架里面是怎样判断的.ThinkPHP:define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && str ...
- PHP 判断是否为 AJAX 请求
先说前端使用 jQuery 时怎么区分: jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest 在后端可以 ...
- PHP中检测ajax请求的代码例子
多数情况下,基于JavaScript 的Js框架如jquery.Mootools.Prototype等,在发出Ajax请求指令时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息, ...
- PHP处理Ajax请求与Ajax跨域
PHP判断是否为Ajax请求 我们知道,在发送ajax请求的时候,可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax, $. ...
- php判断是否为ajax请求
先说前端使用 jQuery 时怎么区分: jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest 在后端可以 ...
- ajax请求总是不成功?浏览器的同源策略和跨域问题详解
场景 码农小明要做一个展示业务数据的大屏给老板看,里面包含了来自自己网站的数据和来自隔壁老王的数据.那么自己网站的数据提供了 http://xiaoming.com/whoami 这样的数据接口隔壁老 ...
- php处理ajax请求,ajax+php实现跨域
第一种方法通过设置Access-Control-Allow-Origin来实现跨域 1.首先要了解什么是域? 什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域.跨 ...
- 一步步学习javascript基础篇(9):ajax请求的回退
需求1: ajax异步请求 url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果) ajax异步请求没问题,问题一般出在刷新url后请求的数据没了,这就是因为url没有记录参数.如 ...
随机推荐
- request属性 request.getAttribute()
一.request.getParameter() 和request.getAttribute() 区别 (1)request.getParameter()取得是通过容器的实现来取得通过类似post,g ...
- 玩KVM
按照网上的一篇博客玩KVM,结果wifi上不了网,上不了网! 把br0下线就好了! 呀------ 11月16日,今天发现kvm卡成屎可能是和kvm内存使用率为0相关,虚拟机中的内存显示内存确实是我配 ...
- .net ServiceStack.Redis 性能调优
最近在debug生产环境的问题时,发现了ServiceStack 4.0.60版本RedisClient存在一个非常严重的性能问题.在高并发下,PooledRedisClientManager.Get ...
- Android Monkey压力测试
Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上. Monkey会发送伪随机的用户事件流,适合对app做压力测试. 1为什 ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- HttpUtility.UrlEncode 和Server.UrlEncode的区别,记录记录,被乱码搞晕头了。。。。。
今天修改原来的站点,有几个session和cookies乱码问题,然后又好好看了一下关于编码这块的内容. 大概是:登录处,用session记录了一点中文内容.然后cookies也记录了一点中文内容,取 ...
- Visual Studio 2015的坑:中文字符串编译后成乱码
(2015年8月5日更新:微软已经修复了Roslyn的这个bug,详见 https://github.com/dotnet/roslyn/pull/4303 ) 昨天,我们用VS2015编译了博客程序 ...
- C#程序员的春天之从零开始学习unity3D游戏开发入门教程二(创建项目及基本面板介绍)
一项目创建: 创建项目是开发的第一步. 运行untiy之后如果是第一次运行会弹出 我们这里随便创建一个项目. 二Untiy面板介绍: 三代码编辑器的切换: 这里我安装了vs2012. 到这里开发环境基 ...
- JavaScript模板引擎artTemplate.js——template.compile()方法
template.compile(source, options) source:必传,渲染模板的内容. options:可选,通常不传.(其实是我还没研究明白) return:一个渲染函数. 示例如 ...
- Centos6.5入侵清理
今天早上来,网站打不开.通过xshell打不开终端,很久才打开.发现内存占用率高达95%,loadavg 15 16 16 现状: 负载太高 15 15 ...