如何在php中检测ajax跨域请求

如何在php中检测ajax跨域请求,php,ajax,cross-domain,jsonp,Php,Ajax,Cross Domain,Jsonp,对于正常的ajax请求,我使用: strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' 但这不适用于跨域请求 如何操作?您可以使用php的getallheaders()函数。您可以检查主机条目Edit2: 如果您以这种方式使用jQuery.ajax函数: var request = $.ajax({ url: "http://somesite.com/somescript.php?somevar=somevalue"

对于正常的ajax请求,我使用:

strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'
但这不适用于跨域请求


如何操作?

您可以使用php的getallheaders()函数。您可以检查主机条目

Edit2: 如果您以这种方式使用jQuery.ajax函数:

var request = $.ajax({
url: "http://somesite.com/somescript.php?somevar=somevalue",
dataType: "jsonp",
jsonp: 'callback',
success: function(data) {
alert('Done!');
}
});
然后,您可以检查
$\u服务器['REQUEST\u URI']
变量,或者简单地检查
$\u GET['callback']
$\u GET[''']
。请求URI将如下所示:

/somescript.php?somevar=somevalue&callback=jquery1720288494187534502896_1333494007273&_=133349443880

编辑:下面的答案是找出它是否是跨域的,而不是检查它是否是AJAX

“如何确定ajax调用是否来自其他域”问题的答案如下:

我使用jQuery.ajax调用,对我来说,使用变量
$\u SERVER['HTTP\u REFERER']
可以很好地工作

如果我在本地计算机上使用一个页面,这个超全局将返回一个空字符串


如果我使用的是internet上的页面,
$\u SERVER['HTTP\u REFERER']
的值返回进行ajax调用的页面的URL。因此,检查此值可以告诉您需要知道的内容。

使用$\u服务器['HTTP\u ORIGIN']获取请求域

检测Ajax和跨域请求尝试以下操作:

function is_ajax_request() {
    return isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : false === 'XMLHttpRequest';
}


function check_cross_domain($referrer, $host) {
    $referrer = str_ireplace( 'www.', '', parse_url( $referrer, PHP_URL_HOST ) );
    $pattern = '/' . $host . '/';
    return preg_match($pattern, $referrer);
}

你想从另一个领域得到什么?HTML?JSON?其他数据?将jQuery.get()与JSONP一起使用:不,我想要的是在php中检测ajax请求!但是如果是跨域的,上面的代码就不起作用了!如果您是为页面提供服务的人,您应该能够判断页面的域与AJAX请求的域不匹配。这是一个简单的字符串比较。@谢谢!我使用$\u服务器['HTTP\u REFERER'],可能是更好的解决方案。我意识到我可能误解了这个问题。我假设问题是如何检测Ajax请求是否来自不同的域。现在我将这个问题解释为“如何检测它是否是ajax请求”。我现在编辑了这篇文章,big time,以改进答案。这一次是通过回答正确的问题来完成的。$\u SERVER['HTTP\u ACCEPT']的值可能也值得研究。这取决于是否使用Ajax或者是否直接访问somescript.php而有所不同。这只是检查它是否跨域,而不是它是否是Ajax请求。如果(!empty($_SERVER['HTTP_X_REQUESTED_WITH'])和&strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])='xmlhttprequest'){$isAjaxRequest=true;}和getallheaders()其中说明了当前请求的详细信息。因此,使用这两种方法可以解决您的问题。问题是$\u服务器['HTTP\u X\u REQUESTED\u WITH']在处理跨域Ajax请求时是空的。我自己也试过了,问题是:使用它对跨域请求不起作用。