关于这个内容,很多人都有所了解。但从我搜索的内容来看,他们只是略微看一下,根本不知道里面到底是什么情况。

受到很多模版代码的影响,大家都以为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'] 小解的更多相关文章

  1. PHP判断ajax请求:HTTP_X_REQUESTED_WITH

    PHP判断ajax请求的原理: 在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的 header头信息, 在jquery框架中,对于通过它的$.ajax, $.g ...

  2. PHP判断请求是否是ajax请求

    首先看一下框架里面是怎样判断的.ThinkPHP:define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && str ...

  3. PHP 判断是否为 AJAX 请求

    先说前端使用 jQuery 时怎么区分: jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest 在后端可以 ...

  4. PHP中检测ajax请求的代码例子

    多数情况下,基于JavaScript 的Js框架如jquery.Mootools.Prototype等,在发出Ajax请求指令时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息, ...

  5. PHP处理Ajax请求与Ajax跨域

    PHP判断是否为Ajax请求 我们知道,在发送ajax请求的时候,可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax, $. ...

  6. php判断是否为ajax请求

    先说前端使用 jQuery 时怎么区分: jQuery 发出 ajax 请求时,会在请求头部添加一个名为 X-Requested-With 的信息,信息内容为:XMLHttpRequest 在后端可以 ...

  7. ajax请求总是不成功?浏览器的同源策略和跨域问题详解

    场景 码农小明要做一个展示业务数据的大屏给老板看,里面包含了来自自己网站的数据和来自隔壁老王的数据.那么自己网站的数据提供了 http://xiaoming.com/whoami 这样的数据接口隔壁老 ...

  8. php处理ajax请求,ajax+php实现跨域

    第一种方法通过设置Access-Control-Allow-Origin来实现跨域 1.首先要了解什么是域? 什么是域,简单来说就是协议+域名或地址+端口,3者只要有任何一个不同就表示不在同一个域.跨 ...

  9. 一步步学习javascript基础篇(9):ajax请求的回退

    需求1: ajax异步请求 url标识请求参数(也就是说复制url在新页面打开也会是ajax后的效果) ajax异步请求没问题,问题一般出在刷新url后请求的数据没了,这就是因为url没有记录参数.如 ...

随机推荐

  1. 激活windows7 企业版小记

    问题:状态不可用 1)控制面板->管理工具->服务,启动SPP Notification Service和Software Protection两项服务后 重启计算机,仍然提示状态不可用. ...

  2. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 远程同步服务器大量基础数据到客户端

    服务器上保存有上万条的基础数据,需要同步到全国各地的成千上万个客户端,而且这些基础数据也经常在有变化调整.这时候需要有一个稳定的数据同步程序,能分批同步基础数据,由于网络流量,网络的稳定性等因素,需要 ...

  3. Java中的instanceof关键字

    instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边的对象是否是它右边的类的实例,返回boo ...

  4. 2748: [HAOI2012]音量调节 bzoj

    Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改 ...

  5. 国内可用maven repository 配置

    国内可用maven repository 配置 发表于2016/1/4 23:08:04  10235人阅读 分类: maven 鉴于一些原因,从maven中央仓库download依赖包时,被各种折磨 ...

  6. Python基础+Pythonweb+Python扩展+Python选修四大专题 超强麦子学院Python35G视频教程

    [保持在百度网盘中的, 可以在观看,嘿嘿 内容有点多,要想下载, 回复后就可以查看下载地址,资源收集不易,请好好珍惜] 下载地址:http://www.fu83.cc/ 感觉文章好,可以小手一抖 -- ...

  7. 读深入了解c++内核对象模型小结(1/3/4)

    之前早就听说这本书不错,如果想对c++进一步的了解可以看看,此书是进阶阶段参考,笔者自己看了书的第一.三.四章节,后面会继续.      第一章讲了c++的对象模型的引入,各种模型的对比和现在c++采 ...

  8. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  9. VPN使用指南|稳定的VPN|

    之前一直用GoagentFQ,但是有时不太稳定,网速也不是很快,然后就试用了云梯VPN,感觉还不错,网速挺快,也比较稳定.http://opticalvpn.com/?r=72ec52481ab8d2 ...

  10. 浅谈微信小程序

    在如火如荼的互联网技术发展中,各种各样的框架出现,当下最受关注的应该就是微信小程序了.从新闻论坛乃至qq群.微信群,很多很多从事IT工作的朋友喜欢讨论研究这个小程序.带着好奇心,我也参与其中. 第一步 ...