«

PHP判断请求是否为AJAX请求XMLHttpRequest

时间:2026-11-15 07:17     作者:emer     分类: PHP


前言

同一个接口既要返回页面又要返回 JSON,需要判断当前请求是不是 AJAX。AJAX 请求一般带 X-Requested-With: XMLHttpRequest 请求头,PHP 通过 $_SERVER 读取判断。本文讲解判断方法、兼容 fetch/axios 和注意事项。

操作步骤

1. 标准判断

function isAjax() {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
        && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

if (isAjax()) {
    header('Content-Type: application/json');
    echo json_encode(['ok' => true]);
    exit;
}

2. 返回 JSON 时设头

header('Content-Type: application/json; charset=utf-8');

3. 不满足时走页面

if (!isAjax()) {
    // 渲染普通页面
}

4. fetch/axios 手动带头

fetch('/api', { headers: { 'X-Requested-With': 'XMLHttpRequest' } });

5. 结合请求方法判断

if (isAjax() && $_SERVER['REQUEST_METHOD'] === 'POST') { ... }

常见坑

  1. 现代 fetch 默认不带该头,需手动添加,判断失效。
  2. 该头可被伪造,不能当作安全鉴权依据。
  3. 大小写不统一,先 strtolower 再比较。
  4. 未设置 Content-Type,前端拿到乱码或纯文本。
  5. 跳转和 AJAX 混用,未 exit 导致页面内容拼进 JSON。
  6. WebSocket、第三方回调不带该头。
  7. 别用它判断登录权限,只区分响应格式。

总结

读 HTTP_X_REQUESTED_WITH 并比对 xmlhttprequest 判断 AJAX,命中则返回 JSON 并设头、exit。fetch 需手动带头,该头可伪造只用于区分格式,不做安全校验。

遇到问题加QQ23979811 协助处理

标签: PHP AJAX XMLHttpRequest 请求头