Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未定义检测AJAX请求$服务器[';HTTP#u X#u REQUESTED#u WITH';]_Javascript_Php_Ajax_Xmlhttprequest - Fatal编程技术网

Javascript 未定义检测AJAX请求$服务器[';HTTP#u X#u REQUESTED#u WITH';]

Javascript 未定义检测AJAX请求$服务器[';HTTP#u X#u REQUESTED#u WITH';],javascript,php,ajax,xmlhttprequest,Javascript,Php,Ajax,Xmlhttprequest,我正在运行适用于linux 5.6.33的XAMPP js代码: var url = "send.php"; xhttp = new XMLHttpRequest(); xhttp.open("POST", url, true); xhttp.setRequestHeader('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest'); xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urle

我正在运行适用于linux 5.6.33的XAMPP

js代码:

var url = "send.php";
xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader('HTTP_X_REQUESTED_WITH', 'XMLHttpRequest');
xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhttp.onload = function() {
    var decoded_response = JSON.parse(xhttp.responseText);
    if (xhttp.readyState == 4 && xhttp.status === 200 && xhttp.responseText && decoded_response) {
        //success
    }
    else if (xhttp.status !== 200 || !xhttp.responseText || !decoded_response) {
        //error
    }
};
xhttp.send(param);
我的send.php文件

  if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest') {
    $encoded = json_encode($ajax_message);

    header('Content-Type: application/x-www-form-urlencoded');

    echo $encoded;

  }
  // else just display the message
  else {
    echo $message;

  }
从firebug中,我可以看到请求和标题,它们都在那里,但是if语句是alwas false,如果我将其添加到php代码中的else中

foreach (getallheaders() as $name => $value) {
echo "$name: $value\n";}
我可以在firebug和HTTP_X_的响应中看到,请求的_仍然存在,因此在我的代码中没有被清除,但是如果我尝试的话

echo $_SERVER['HTTP_X_REQUESTED_WITH'];
我知道这是一个未定义的索引


我没有对Web服务器进行任何更改,也没有任何.htaccess文件,我无法理解为什么$\u服务器['HTTP\u X\u REQUESTED\u WITH']不工作。

标题名称应为
X-REQUESTED-WITH

PHP只需将其转换为所有大写字母,将
-
替换为
-
,并在
$\u服务器
中表达时以
HTTP
作为前缀

在转换到JS之前,您需要手动进行转换,然后PHP再次进行转换



不过,
X-request-With
是一个相当肮脏的黑客行为。我会使用类似于
Accept:application/json
的东西来请求json响应,而不是HTML响应(并在PHP中查找该标题)。

我在发布的标题名称之前使用了该标题名称,因为它不会与该事件一起工作。而且仍然不起作用。你能解释一下为什么是一个肮脏的黑客吗?这里的堆栈基本上是这种类型请求的第一个答案。服务器不应该关心什么工具请求数据,它应该关心请求什么数据(以及以什么格式)。但我想检查请求什么数据,发出的数据只取决于请求什么。