Ajax與Pjax請求在服務端是如何識別的

2021-08-02 08:39:25 字數 2101 閱讀 2727

我在後台處理ajax和一般的網頁請求時,一般是需要額外加個引數進行區分的。比如使用get引數的is_ajax=1,後台判斷有is_ajax=1成立時,表明該請求是ajax請求,遂可區分處理。我正在使用的電商**tpshop裡邊我遇到的都這樣處理,如果乙個介面可同時處理網頁和jax的話,需要使用is_ajax來區分。

但我在看thinkphp5的官方手冊時,遇到裡邊說:

預設情況下,控制器在ajax請求會對返回型別自動轉換,預設為json。

還有:

error方法會自動判斷當前請求是否屬於 ajax 請求,如果屬於ajax請求則會自動轉換為default_ajax_return配置的格式返回資訊。

這兩處分明就不是用is_ajax來區分網頁和ajax請求的,那到底是什麼原理呢?

翻一下原始碼:

/**

* 當前是否ajax請求

* @access public

* @param bool $ajax true 獲取原始ajax請求

* @return bool

*/public function isajax($ajax = false)

else

}

原來是根據$_server[『http_x_requested_with『]來設別的,所有的ajax請求都會帶這個標識嗎?

在半夜寒羽的部落格中有觀點:

在傳送ajax請求的時候,我們可以通過xmlhttprequest這個物件,建立自定義的header頭資訊, 在jquery框架中,對於通過它的$.ajax,$.get, or $.post方法請求網頁內容時,它會向伺服器傳遞乙個http_x_requested_with的引數,php中就是在header一層判斷是否是ajax請求,對應的根據$_server['http_x_requested_with']判斷。

但又有網友遇到有些ajax框架是不帶這個資訊的,這就比較坑了,想想這又不是標準規範,帶不帶確實都得看個性的。所以,還是自己搞個is_ajax變數做判斷妥一些。如果是自己開發的**,用的是jquery,應該也無所謂了。

在看原始碼的時候隨便看到了:

/**

* 當前是否pjax請求

* @access public

* @param bool $pjax true 獲取原始pjax請求

* @return bool

*/public function ispjax($pjax = false)

else

}

看來有乙個非標準約束的標誌出現了http_x_pjax。(非標準的好像都帶上『x』)。

那pjax又是什麼玩意?我簡單將我查閱的資料摘錄一下。

history api中有幾個新特性,分別是history.pushstate和history.replacestate,我們把pushstate+ajax進行封裝,合起來簡單點叫,就是pjax。

如何使用:

將jquery.pjax.js部署到你的頁面中,將需要使用pjax的a鏈結進行繫結(不能繫結外域的url),如:

$('a').pjax();

至於後台,跟處理ajax一樣,只是用http_x_pjax來區分是否是pjax請求。

主要參考資料

1、 php判斷ajax請求:http_x_requested_with

2、 http之x-requested-with分析和思考

3、 pjax的實現與應用

4、 pjax:ajax和pushstate結合的js庫

-end-

PHP 服務端偽 Ajax 請求

有時候,你可能有這樣的需求,我們的a程式在處理客戶端的請求時,想要以使用者的身份給我們的b程式傳送乙個請求,但是又不想等待它的請求結果,有什麼樣的方法來解決這樣的情景呢?這時候,我們必須以socket的方式來建立乙個鏈結,然後把我們的請求資料以get或者post的方式傳遞過去,而無須等待它的響應結果...

服務端配置實現AJAX跨域請求

一直以為ajax跨域是無法逾越的鴻溝,最近發現原來在服務端可以通過傳送header資訊來允許ajax跨域請求。php 示例 複製 如下 header access control allow origin header access control allwww.cppcns.comow heade...

SSRF(服務端請求偽造)

ssrf server side request forgery 伺服器端請求偽造 是一種由攻擊者構造形成由服務端發起請求的乙個安全漏洞。一般情況下,ssrf攻擊的目標是從外網無法訪問的內部系統。正是因為它是由服務端發起的,所以它能夠請求到與它相連而與外網隔離的內部系統 作為web安全萌新,以上晦澀...