Han*_*ank 68 php ajax http-headers
在整个互联网上,甚至包括在Stack Overflow中,人们声称检查请求是否是AJAX的好方法是执行以下操作:
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}
Run Code Online (Sandbox Code Playgroud)
但是,我没有$_SERVER['HTTP_X_REQUESTED_WITH']在官方PHP文档中看到
当我尝试执行以下操作时:
echo $_SERVER['HTTP_X_REQUESTED_WITH'];
Run Code Online (Sandbox Code Playgroud)
什么都没输出.
难道我做错了什么?因为我真的希望能够使用$_SERVER['HTTP_X_REQUESTED_WITH']它是否可用.
Pek*_*ica 61
变量$_SERVER并不是PHP的一部分,这就是为什么你不会在PHP文档中找到它们.它们由Web服务器准备,Web服务器将它们传递给脚本语言.
据我所知,它X-Requested-With是由大多数主要框架的Ajax函数发送的,但不是全部(例如,Dojo,仅在两年前添加它:#5801).因此,考虑到@bobince的注释,可以肯定地说,确定请求是否是AJAX请求通常不是100%可靠的方法.
唯一100%安全的方法是发送预定义标志(例如GET变量)以及请求和接收页面以检查是否存在该标志.
J. *_*son 27
不要忘记你可以轻易地用cURL欺骗任何标题
curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 17
$_SERVERHTTP_从HTTP请求标头生成的密钥.在这种情况下,X-Requested-With标题.
Jer*_*NER 14
此标头是所有AJAX库中的标准化进程.
它不会在php文档中记录,而是在设置此标头的不同AJAX库中记录.公共库确实发送了这个头:jQuery,Mojo,Prototype,...
通常这些库将使用标头设置
xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
Run Code Online (Sandbox Code Playgroud)
这是一个带有示例用法的快速函数:
function isXmlHttpRequest()
{
$header = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : null;
return ($header === 'XMLHttpRequest');
}
// example - checking our active call
if(!isXmlHttpRequest())
{
echo 'Not an ajax request';
}
else
{
echo 'is an ajax request';
}
Run Code Online (Sandbox Code Playgroud)