Как узнать, является ли запрос 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]

1

Решение

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

3

Другие решения

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

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

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

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

0
По вопросам рекламы [email protected]