Как узнать, является ли запрос ajax-запросом?

Я пытаюсь выяснить, отправляется ли запрос в файл 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!'; 

Но мой сервер не имеет этой переменной: Undefined index: 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 ? И если нет, есть ли способ найти, является ли запрос AJAX, используя $_SERVER[HTTP_ACCEPT]

Related of "Как узнать, является ли запрос ajax-запросом?"

Нет 100% -ного способа определить, был ли запрос выполнен через ajax. Даже если кто-то отправляет заголовок с помощью «X-Requested-With: XMLHttpRequest», вы не должны полагаться на него.

что вы можете сделать, это предоставить свою собственную определенную переменную и использовать шаблон проектирования команд для проверки результата, например:

 $.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!'; } в  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!'; } 

Не все браузеры отправят этот ответ, который я обычно использую

 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 заполняется веб-сервером