在 PHP 中检测 Ajax


Detect Ajax in PHP

我正在尝试在同一个php页面上发布ajax帖子。

阿贾克斯:

$("#loginForm").submit(function(e) {
    e.preventDefault();
    var postData = $(this).serialize();
    $.post("login.php", 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,并且永远不会执行回声线。我在这里做错了什么?

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

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

我建议使用GET参数来识别AJAX请求。$_SERVER 取决于 Web 服务器和 JavaScript 框架。

-> 使用 AJAX 时将 URL 更改为 login.php?ajax=1。

您正在搜索的标头称为"X-Request-With"(值 XMLHttpRequest),无法使用 $_SERVER['HTTP_X_REQUESTED_WITH'] 检索。

您可以使用 $_SERVER 变量上的var_dump自己找到它。 或者,您也可以使用浏览器找出发送的标头是什么。

获取脚本中的请求标头,可以使用 getallheaders 函数完成。

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

在vanilla javascript中,你需要将它添加到你的ajax中:

xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

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

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

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

我目前正在使用axios而不修改任何标题设置。

根据您的 javascript 包,您可能需要在标头中定义ACCEPT才能使其对您有效。

但是对于大多数 AJAX 软件包,默认情况下它始终存在并且工作正常。