在現代 Web 開發中,常需區分 AJAX 請求與一般瀏覽器請求,以回傳不同內容(如 AJAX 回傳 JSON/片段,一般請求回傳完整頁面)。本文介紹兩種判斷方式,並說明為何第二種方法更利於 SEO。
// 前端 AJAX 請求帶上 ?ajax=1
if (isset($_GET['ajax'])) {
// AJAX 請求邏輯
} else {
// 一般請求邏輯
}
缺點:URL 不同,搜尋引擎爬蟲無法取得完整頁面內容,不利 SEO;且無法在同一 URL 同時服務使用者與爬蟲。
jQuery 的 $.ajax、$.get、$.post 會自動送出 X-Requested-With: XMLHttpRequest 標頭。
if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
// AJAX 請求:回傳精簡內容、JSON 或局部 HTML
} else {
// 一般請求:回傳完整頁面(含版面、導航、SEO 標籤)
}
此模式符合 Progressive Enhancement 原則。
iframe 中發起,瀏覽器不會送出 X-Requested-With,無法判斷。需改用 Token 或自訂標頭。function isAjaxRequest(): bool {
return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
if (isAjaxRequest()) {
header('Content-Type: application/json');
echo json_encode(['status' => 'ok', 'data' => $partialContent]);
} else {
// 載入完整版面模板
include 'layout/header.php';
echo $fullContent;
include 'layout/footer.php';
}