在PHP中检测Ajax

3

我正在尝试向同一个PHP页面进行ajax提交。

Ajax:

$("#loginForm").submit(function(e) {
    e.preventDefault();
    var postData = $(this).serialize();
    $.post("login.php", postData);
});
postData正确且格式如下:
username=john&password=123123

PHP(同一页面):

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
      echo 'Ajax Request Detected';
}

然而,这个if检查总是返回false,echo语句从未执行。我在这里做错了什么?

我可能会看一下现有的代码,比如ZF的ContextSwitch助手。我认为这很简单:return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');假设答案也取决于服务器。 - ficuscr
5个回答

9

以下是在php中检测ajax请求的正确方法:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) {
    // this is ajax request, do something
}

1
你正在寻找的标题称为“X-Requested-With”(值为XMLHttpRequest),无法使用$_SERVER['HTTP_X_REQUESTED_WITH']检索。
您可以使用var_dump在$ _SERVER变量上找到此内容。或者,您也可以使用浏览器查找发送的标题。
通过getallheaders函数,在脚本中获取请求头是可行的。

http://us3.php.net/manual/en/function.getallheaders.php


1
我建议使用GET参数来识别AJAX请求。 $_SERVER依赖于Web服务器和JavaScript框架。
-> 当使用AJAX时,请将您的URL更改为login.php?ajax=1。

这是我做过很多次的事情。它可以在任何服务器上运行 :) 如果您不想将其放在URI上,还可以附加到POST值。 - ficuscr

0
在原生JavaScript中,您需要将以下内容添加到您的ajax中:
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

我不知道如何在jQuery中完成,但应该是可行的。


0

我尝试了所有建议的答案,但对我有效的是使用以下代码

if (strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false) {
  //this request expects json
  die('json expectd');
}
die('non json');

我目前在使用axios,没有修改任何头部设置。

根据你的JavaScript包,你可能需要在头部中定义ACCEPT才能使其对你有效。

但是对于大多数AJAX包来说,这通常是默认存在的,并且可以正常工作。


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