如何判断一个请求是否为ajax请求?

3

我尝试确定一个对PHP文件的请求是通过ajax发送还是其他方法。

我搜索了一下并阅读了很多文章,其中建议采用以下方法:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {     
    echo 'This is an ajax request!';   
    exit;
}
echo 'This is not an ajax request!';

但是我的服务器没有这个变量:未定义的索引:HTTP_X_REQUESTED_WITH ...

这是我发起ajax请求的方式:

$.ajax({
    url: 'http://URL/test.php',
    complete: function(res) {
        console.log(res.responseText);
    }
});

我从不同的URL发起了这个请求,所以我设置了header('Access-Control-Allow-Origin: *');

但是我发现$_SERVER有一个区别:

Ajax请求:$_SERVER[HTTP_ACCEPT] => */*

非Ajax请求:$_SERVER[HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

我的问题是,是否有办法将HTTP_X_REQUESTED_WITH放入$_SERVER中?如果没有,是否有合适的方法可以使用$_SERVER[HTTP_ACCEPT]来确定请求是否为Ajax?


你使用的是哪个版本的jQuery?应该是1.5或更高。 - Sri Tirupathi Raju
3个回答

4

没有100%的方法可以检测请求是否通过ajax发出。即使有人发送带有"X-Requested-With: XMLHttpRequest"标头的请求,也不应该依赖它。


1

并不是所有浏览器都会发送该响应 我通常使用

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {//Do stuff }

以及用于Ajax

request = $.ajax({
    url: SomePage.php,
    type: "POST",
    data: {key: value}
});
request.done(function(returnedData) {
    //do done stuff
});
request.fail(function(jqXHR, textStatus) {
    //do fail stuff
});

注意:
$HTTP_SERVER_VARS contains the same initial information, but is not a superglobal. 
(Note that $HTTP_SERVER_VARS and $_SERVER are different variables and that 
PHP handles them as such). Also note that long arrays were removed since PHP 5.4.0 so 
$HTTP_SERVER_VARS doesn't exist anymore.

所以使用var_dump($HTTP_SERVER_VARS);来查看它是否包含在其中,还要注意$_SERVER是由Web服务器填充的。


这似乎不是浏览器的问题,我测试了 Chrome、Safari 和 FF,它们都没有那个头部。我只是想知道其他人是如何获得该头部的,因为看起来许多人使用该技术来查找 AJAX 请求。 - Stephan Wagner
你使用的是哪个PHP版本和Web服务器? - Pwner
这是一个带有 Plesk 的虚拟服务器,PHP 版本为 5.3.2-1ubuntu4.23。 - Stephan Wagner

0
你可以提供自己定义的变量,并使用命令设计模式来测试结果,例如:
$.ajax({
   url: 'http://URL/test.php',
   data: {action: "ajax_request"},
   complete: function(res) {
   console.log(res.responseText);
 }
 });

还有 PHP 测试:

if (isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch ($action) {
         case 'ajax_request' : echo 'This is an ajax request!';
        break;

   }
}
else
  echo 'This is not an ajax request!';

也试试这个

 while(true)
 {
     ......
    if (window.XMLHttpRequest){
       echo 'This is an ajax request!';
       return new XMLHttpRequest();
    }
     else if(window.ActiveXObject)// for internet explorer
    {
         echo 'This is an ajax request'!;
         return new ActiveXObject("Microsoft.XMLHTTP");
    }
    else
       echo 'This is not an ajax request!';
 }

问题在于我希望其他用户发送Ajax请求,因此我不知道他们将如何发送它。 - Stephan Wagner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接