在 PHP 中检测 Ajax

问题描述 投票:0回答:5

我正在尝试将 ajax 发布到同一个 php 页面。

阿贾克斯:

$("#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-check 总是返回 false,并且 echo 行永远不会被执行。我在这里做错了什么?

php jquery ajax forms authentication
5个回答
9
投票

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

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

1
投票

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

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


1
投票

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

您可能自己使用 $_SERVER 变量上的 var_dump 发现了这一点。或者,您也可以使用浏览器来查找发送的标头是什么。

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

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


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 包来说,默认情况下它始终存在并且工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.