簡體   English   中英

如何確定請求是否是ajax請求?

[英]How to find out if a request is an ajax request?

我試圖找出ajax是否發送了對PHP文件的請求。

我用Google搜索並閱讀了一大堆提示以下方法的文章:

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);
    }
});

我正在從另一個網址撥打電話,所以我設置了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 如果沒有,是否有正確的方法通過使用$_SERVER[HTTP_ACCEPT]來確定請求是否為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!';
 }

並非所有瀏覽器都會發送我通常使用的響應

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是由網絡服務器填寫的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM