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') { ... }
常见坑
- 现代 fetch 默认不带该头,需手动添加,判断失效。
- 该头可被伪造,不能当作安全鉴权依据。
- 大小写不统一,先 strtolower 再比较。
- 未设置 Content-Type,前端拿到乱码或纯文本。
- 跳转和 AJAX 混用,未 exit 导致页面内容拼进 JSON。
- WebSocket、第三方回调不带该头。
- 别用它判断登录权限,只区分响应格式。
总结
读 HTTP_X_REQUESTED_WITH 并比对 xmlhttprequest 判断 AJAX,命中则返回 JSON 并设头、exit。fetch 需手动带头,该头可伪造只用于区分格式,不做安全校验。
遇到问题加QQ23979811 协助处理
标签: PHP AJAX XMLHttpRequest 请求头