最常用且可靠的方式是检查$_server['http_x_requested_with']是否为'xmlhttprequest'(大小写不敏感);但跨域jsonp、fetch等场景下该头可能缺失,需结合accept头、session、csrf等多维度验证。

PHP判断是否为AJAX请求,最常用且可靠的方式是检查HTTP请求头中的 X-Requested-With 字段——它在绝大多数AJAX调用中被自动或手动设为 XMLHttpRequest。但这个方法不是万能的,原生实现简单,局限性却很实际。
原生PHP判断的核心写法
标准做法是读取 $_SERVER['HTTP_X_REQUESTED_WITH'] 并做大小写不敏感比对:
- 该字段由前端JS库(如jQuery、Axios)或原生
XMLHttpRequest在发送请求时默认注入 - PHP中需转换为下划线格式:
HTTP_X_REQUESTED_WITH(这是PHP对HTTP头的统一命名规则) - 推荐使用
strtolower()避免大小写差异导致误判
示例函数:
function isAjax(): bool {
return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
跨域场景下的典型失效
当使用JSONP或script标签方式实现跨域请求时,浏览器根本不会触发 XMLHttpRequest,而是动态插入 <script></script> 标签,此时请求头里没有 X-Requested-With,原生判断必然返回 false。
- JSONP请求的
Accept头通常为text/javascript或application/javascript - 普通AJAX(同域)的
Accept多为application/json或*/* - 可结合
$_SERVER['HTTP_ACCEPT']做辅助识别,但不能单独依赖
现代前端带来的新变量
越来越多项目使用 Fetch API、Vue/React 的封装请求库,它们默认不设置 X-Requested-With,除非开发者显式添加:
- Fetch 不自动带该头,需手动在
headers中加入:headers: {'X-Requested-With': 'XMLHttpRequest'} - Axios 默认带上,但可被配置关闭;某些CDN或代理可能过滤自定义头
- 服务端若只认这个头,就容易把合法的现代AJAX当成普通请求
安全与工程实践建议
单靠请求头识别存在伪造风险(攻击者可轻易构造含 X-Requested-With: XMLHttpRequest 的请求),因此生产环境应叠加其他维度验证:
- 校验Session是否存在且有效,AJAX接口通常要求用户已登录
- 配合CSRF Token验证,尤其是POST/PUT/DELETE类操作
- 对关键接口,可要求额外自定义头(如
X-App-Version或X-Requested-By),并在前端统一注入 - 避免仅靠
$_GET['ajax']=1这类URL参数判断——易被爬虫或恶意链接触发,破坏SEO和语义一致性
原生判断不复杂,但容易忽略边界情况。真正健壮的方案,从来不是“只认一个头”,而是结合上下文、安全机制与业务约定来综合决策。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











