PHP判斷ajax請求:HTTP_X_REQUESTED_WITH

有時咱們須要判斷是否是ajax請求來決定模塊輸出仍是json格式輸出.javascript

PHP判斷ajax請求的原理:

在發送ajax請求的時候,咱們能夠經過XMLHttpRequest這個對象,建立自定義的header頭信息, 在jquery框架中,對於經過它的$.ajax, $.get, or $.post方法請求網頁內容時,它會向服務器傳遞一個HTTP_X_REQUESTED_WITH的參數,php中就是在header一層判斷是不是ajax請求,對應的根據$_SERVER['HTTP_X_REQUESTED_WITH']判斷。php

/**
  * 當前請求是否ajax請求
  *
  * @access public
  * @return bool
  */
 function isAjax()
 {
     return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest';
 }

注意:

PHP判斷AJAX請求時跨域問題:

若是是跨域的話這個,上面的isAjax就徹底不正確了。跨域同域的問題參考:《$.getjson遇到的幾個問題》使用$.getJSON來實現跨域,可是檢測是不是ajax一直是false,並嘗試$get(參看:$.get實現返回解析json數據以及jsonp跨域)以後無果的以後,考慮要使用萬能的$ajax方法,見ajax的文檔:html

若是指定了script或者jsonp類型,那麼當從服務器接收到數據時,其實是用了<script>標籤而不是 XMLHttpRequest對象。這種狀況下,$.ajax()再也不返回一個XMLHttpRequest對象,而且也不會傳遞事件處理函數,好比 beforeSend。java

解釋:

ajax跨域只能指定jsonp格式的數據,這個是就不是XMLHttpRequest對象了,就算你自定義一個$_SERVER['HTTP_X_REQUESTED_WITH']也是沒有意義的jquery

解決的辦法:

針對跨域狀況的getjson 或者ajax(jsonp)可使用ACCEPT請求頭部格式來判斷ajax

PHP端對應$_SERVER['HTTP_ACCEPT']json

jsonp的請求通常是:text/javascript, application/javascript, */*跨域

json的請求:application/json, text/javascript, */*服務器

一個簡單的判斷跨域條件下的ajax請求:app

switch ($_SERVER['HTTP_ACCEPT']){  
    case 'application/json, text/javascript, */*':  
        //  JSON 格式  
        break;  
    case 'text/javascript, application/javascript, */*':  
        // javascript 或 JSONP 格式  
        break;  
    case 'text/html, */*':  
        //  HTML 格式  
        break;  
    case 'application/xml, text/xml, */*':  
        //  XML 格式  
        break;  
}
相關文章
相關標籤/搜索