首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 偵測 AJAX 請求的標準做法:HTTP_X_REQUESTED_WITH 標頭檢測

     編輯:PHP 相關知識

在開發 AJAX 介面時,常需區分「普通頁面請求」與「AJAX 請求」以返回不同格式資料(HTML vs JSON)或執行不同邏輯。主流 JS 框架會自動添加 X-Requested-With: XMLHttpRequest 標頭,PHP 可透過 $_SERVER['HTTP_X_REQUESTED_WITH'] 偵測。

一、標準檢測代碼

<?php
function isAjaxRequest(): bool {
    return !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
        && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

// 使用範例
if (isAjaxRequest()) {
    // AJAX 請求:返回 JSON
    header('Content-Type: application/json');
    echo json_encode(['status' => 'ok', 'data' => $data]);
} else {
    // 普通請求:渲染完整頁面
    include 'view/page.php';
}

二、主流框架支援情況

框架/庫自動發送 X-Requested-With備註
jQuery是$.ajax、$.get、$.post 等
Axios是預設開啟
Fetch API否需手動添加:headers: {'X-Requested-With': 'XMLHttpRequest'}
Vue Resource是
Angular $http是

三、偽造與繞過風險

此標頭完全可被客戶端偽造(curl、Postman、瀏覽器擴充套件皆可自定義標頭)。因此:

  • 不可用於權限驗證、CSRF 防護等安全敏感判斷。
  • 僅作為「返回格式切換」「日誌標記」「統計分析」等非安全用途。
  • 真正的 AJAX 安全防護應使用 CSRF Token、SameSite Cookie、雙重 Cookie 驗證 等機制。

四、進階:封裝為 Request 物件方法

class HttpRequest {
    public static function isAjax(): bool {
        return (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
            && strcasecmp($_SERVER['HTTP_X_REQUESTED_WITH'], 'XMLHttpRequest') === 0);
    }

    public static function wantsJson(): bool {
        return self::isAjax()
            || (isset($_SERVER['HTTP_ACCEPT'])
                && strpos($_SERVER['HTTP_ACCEPT'], 'application/json') !== false);
    }
}

// 控制器中使用
if (HttpRequest::wantsJson()) {
    return response()->json($data);
}
return view('page', compact('data'));

五、總結

檢測 HTTP_X_REQUESTED_WITH 是識別 AJAX 請求的行業慣例,實現簡單、兼容性好。但務必牢記:**它不是安全機制**,僅供「禮貌性」區分請求類型。安全防護請另行實施 CSRF Token、SameSite 等標準方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved