代码片段 → PHP → 检测 AJAX 请求 检测 AJAX 请求 Chris Coyier 于 2009年9月4日 HTTP_X_REQUESTED_WITH 头部信息由所有支持 AJAX 请求的最新浏览器发送。 if ( !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) { # Ex. check the query and serve requested data }
我认为在这种情况下,isset() 比 !empty() 更合适。不过仍然是一个有用的代码片段。 :)
empty() 做的第一件事几乎就是确保 isset 为 false。以这种方式使用 isset 和 empty 是多余的。对于未设置的变量,empty() 总是返回 false(并且不会出现错误…)。
来自 PHP.net 上的
empty()
(https://php.ac.cn/manual/en/function.empty.php)因此,为了避免出现有关变量是否已设置或属性是否已设置的通知,您应该同时使用 isset() 和 !empty()。
if (isset($_SERVER['HTTP_X_REQUESTED_WITH'] && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
# 例如:检查查询并提供请求的数据
}
您错过了 isset 的闭合括号,呵呵。
*语法狂魔*
很棒且实用的代码片段,但是,我想知道在同一页面上使用同步(普通请求)和异步(ajax 请求)请求时,使用这种方法是否有很大的或重要的缺点。
语句“HTTP_X_REQUESTED_WITH 头部信息由所有支持 AJAX 请求的最新浏览器发送。”完全错误。
浏览器不会发送此头部信息,JavaScript 库会发送。像 jQuery、Prototype 和 MooTools 这样的库。
大家好,
我想在每次 AJAX 请求之前检查互联网连接是否可用。如果连接可用,则继续;否则,显示一个弹出消息——网络不可用。
我编写了 JavaScript 代码来检查网络连接。但是,为了检查请求是 AJAX 请求还是普通请求,如果在我的 JavaScript 代码中添加以下过滤器
if (isset($_SERVER[‘HTTP_X_REQUESTED_WITH’] && !empty($_SERVER[‘HTTP_X_REQUESTED_WITH’]) && strtolower($_SERVER[‘HTTP_X_REQUESTED_WITH’]) == ‘xmlhttprequest’))
我收到了以下错误
$_SERVER 未定义
如果我做错了,谁能纠正我。
@Suresh,您试图在 JavaScript 中运行 PHP 代码。$_SERVER 仅对 PHP 可用,因此您会得到“未定义”。
默认情况下,使用 ajax 的头部信息为:Accept:application/json, text/javascript, */*
而非 ajax 的头部信息则类似于 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
css 头部信息:Accept:text/css,*/*; 它取决于您的请求文件。
如果您使用的是 CodeIgniter 等 PHP 框架,则可以使用 $this->input->is_ajax_request()。请参阅 https://codeigniter.net.cn/user_guide/libraries/input.html
顺便说一句,$_SERVER[‘HTTP_X_REQUESTED_WITH’] 是检测 ajax 请求的最佳方法。
您应该为此感谢 David Walsh,因为我知道您是从某个地方获取的,而不是自己编写的,Chris。
http://davidwalsh.name/detect-ajax
无需将 isset() 与 empty() 结合使用,因为 empty() 不会输出任何错误。
https://php.ac.cn/manual/en/function.empty.php
在我看来,这不是检测请求是否由“ajax”发出的正确方法。请求就是请求,结果仅在所需的文档类型方面有所不同,正如 Idham 提到的那样。因此,如果需要 html、xml 或 json,则以这种类型输出。在 PHP 中,您可以从 $_SERVER[“HTTP_ACCEPT”] 中获取此信息,此信息存在于每个请求(类型)中。也许这在开始时会有所帮助
$t = $_SERVER[“HTTP_ACCEPT”];
if(strpos($t, ‘application/json’) !== false){
// 需要 JSON
}
elseif(strpos($t, ‘application/xml’) !== false){
// 需要 XML
}
else{
// 回退到 HTML
}
@kokuswolf 谢谢,这是一个关于正在发生的事情的有用分解。我一直使用David Walsh 的版本,也就是 Chris 在这里重新发布的版本。但我注意到他们的条件难以识别某些来自某些基于 Node 的 AJAX 库的请求(根据我的经验,主要是Axios)。我认为您更简单的
$_SERVER['HTTP_ACCEPT']
检查将解决此问题!谢谢 Chris!这正是我一直在寻找的!:)
这是一种薄弱的方法,很容易用 cURL 欺骗。