PHP判断ajax请求:HTTP_X_REQUESTED_WITH
本文发布于 12 年前, 内容可能已经过时或失效!
有时我们需要判断是不是ajax请求来决定模块输出还是json格式输出.
## PHP判断ajax请求的原理:
在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax, $.get, or $.post方法请求网页内容时,它会向服务器传递一个`HTTP_X_REQUESTED_WITH`的参数,php中就是在header一层判断是否是ajax请求,对应的根据`$_SERVER['HTTP_X_REQUESTED_WITH']`判断。
```php
/**
* 当前请求是否ajax请求
*
* @access public
* @return bool
*/
function isAjax()
{
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest';
}
```
#### 注意:
- 一般情况下`$_SERVER['HTTP_X_REQUESTED_WITH']`默认是XMLHttpRequest
- `$_SERVER['HTTP_X_REQUESTED_WITH']`也可以自定义创建的,使用XMLHttpRequest.setRequestHeader(name,value);
参考文章: [http://www.skygq.com/2011/01/04/php-check-request-from-ajax-or-normal/](http://www.skygq.com/2011/01/04/php-check-request-from-ajax-or-normal)
## PHP判断AJAX请求时跨域问题:
如果是跨域的话这个,上面的isAjax就完全不正确了。跨域同域的问题参考:《 [$.getjson遇到的几个问题](http://www.php10086.com/2011/12/292.html)》使用 [$.getJSON](http://www.php10086.com/2011/12/292.html) 来实现跨域,但是检测是否是ajax一直是false,并尝试$get(参看: [$.get实现返回解析json数据以及jsonp跨域](http://www.php10086.com/2012/07/843.html))之后无果的之后,考虑要使用万能的$ajax方法,见ajax的文档:
如果指定了script或者jsonp类型,那么当从服务器接收到数据时,实际上是用了`<script>`标签而不是 XMLHttpRequest对象。这种情况下,$.ajax()不再返回一个XMLHttpRequest对象,并且也不会传递事件处理函数,比如 beforeSend。
#### 解释:
ajax跨域只能指定jsonp格式的数据,这个是就不是XMLHttpRequest对象了,就算你自定义一个`$_SERVER['HTTP_X_REQUESTED_WITH']`也是没有意义的
#### 解决的办法:
针对跨域情况的getjson 或者ajax(jsonp)可以使用ACCEPT请求头部格式来判断
PHP端对应`$_SERVER['HTTP_ACCEPT']`
jsonp的请求一般是:`text/javascript, application/javascript, */*`
json的请求:`application/json, text/javascript, */*`
一个简单的判断跨域条件下的ajax请求:
```php
switch ($_SERVER['HTTP_ACCEPT']){
case 'application/json, text/javascript, */*':
// JSON 格式
break;
case 'text/javascript, application/javascript, */*':
// javascript 或 JSONP 格式
break;
case 'text/html, */*':
// HTML 格式
break;
case 'application/xml, text/xml, */*':
// XML 格式
break;
}
```