2014-10-24 3 views
1

Я пытаюсь выяснить, отправлен ли запрос в файл PHP с помощью ajax или нет.Как узнать, является ли запрос 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]

+0

в какой версии вы используете jquery? он должен быть 1,5 или выше –

+0

новейшая версия 1.11 –

ответ

3

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

0

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

$.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

Проблема в том, что я хочу, чтобы другие пользователи отправляли запрос ajax, и поэтому я не знаю, как они его отправят. –

+0

seee обновленное сообщение. @StephanWagner –

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

Это не похоже на браузер, я тестировал хром, сафари, FF, и ни один из них не имеет этого заголовка, мне просто интересно, как другие люди получают заголовок, поскольку кажется, что многие используют эту технику для поиска запроса ajax –

+0

Какую версию PHP вы используете и какой веб-сервер? – Pwner

+0

Является виртуальным сервером с plesk, PHP Версия 5.3.2-1ubuntu4.23 –

Смежные вопросы