使用 PHP 判斷 jQuery 傳來的 AJAX 請求類型
Posted in 三月 7th, 2010 by 阿育 | Filed under Web開發, 程式設計 | Comments (0)今天看到 Detecting Ajax Events on the Server 這篇文章中提到一個有趣的好方法,當jQuery送出AJAX請求時會附上 X-Requested-With 請求檔頭,其值為「XMLHttpRequest」。
依據該文的描述在PHP中我們可以透過判斷 X-Requested-With 請求檔頭來分辨現在的請求是不是AJAX請求而給予不同的回應。
但這樣的判斷似乎不夠完整,在某些時候我們可能需要更進一步的判斷,jQuery所提供的AJAX方法不僅可以指定回傳的格式,它在送出AJAX請求時也會根據指定回傳格式的不同而傳出不同的Accept請求檔頭,因此在相同的概念下進一步聯想,其實我們還可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下依據該文的描述透過判斷 $_SERVER[ 'HTTP_X_REQUESTED_WITH' ] 來分辨現在的請求是不是AJAX請求而給予不同的回應。
例如:
if('XMLHttpRequest' === $_SERVER[ 'HTTP_X_REQUESTED_WITH' ]){
// 回應 AJAX 請求,例如JSON格式
echo json_encode(array('message' => 'hello'));
} else {
// 回應一般請求,例如HTML格式
echo 'hello';
}
當需要更進一步區分請求類型的不同時,將可以透過「Accept」請求檔頭來分辨現在的請求是什麼樣的類型。
以下我整理出jQuery中各種不同的AJAX方法所傳出的「Accept」請求檔頭:
| jQuery code | Accept header |
|---|---|
| $.getJSON(URL);
$.ajax({url:URL, dataType :’json’}); |
application/json, text/javascript, */* |
| $.getScript(URL);
$.ajax({url:URL, dataType :’script’}) ; $.ajax({url:URL, dataType :’jsonp’}) ; |
text/javascript, application/javascript, */* |
| $.get(URL); | */* |
| $(‘#result’).load(URL);
$.ajax({url:URL, dataType :’html’}); |
text/html, */* |
| $.ajax({url:URL, dataType :’xml’}) | application/xml, text/xml, */* |
現在有了這個對照表,我們就可以根據Accept header來回應不同格式的結果:
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;
}
參考文章:Detecting Ajax Events on the Serve




