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

Posted

技术标签:

【中文标题】如何在php中检测ajax跨域请求【英文标题】:How to detect ajax cross domain request in php 【发布时间】:2012-04-17 08:52:29 【问题描述】:

对于我使用的普通 ajax 请求:

strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'

但这不适用于跨域请求。

我该怎么办?

【问题讨论】:

您想从其他域获取什么? html? JSON?其他数据? 将 jQuery.get() 与 JSONP 一起使用:api.jquery.com/jQuery.getJSON 不,我想要的是在 php 中检测 ajax 请求!但是如果是跨域的,上面的代码就不行了! 如果您是该页面的服务者,您应该能够判断该页面的域与 AJAX 请求的域不匹配。这是一个简单的字符串比较。 @Diodeus 谢谢!我使用 $_SERVER['HTTP_REFERER'],也许是更好的解决方案。 【参考方案1】:

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

【讨论】:

这只是检查它是否是跨域的,而不是 Ajax 请求。 if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') $isAjaxRequest = true; 和 getallheaders() 说明当前请求的详细信息。因此,同时使用它们可以解决您的问题。 问题是$_SERVER['HTTP_X_REQUESTED_WITH'] 在涉及跨域Ajax请求时为空。我自己尝试过,它在问题中这样说:Using that doesn't work for cross-domain requests.【参考方案2】:

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

var request = $.ajax(
url: "http://somesite.com/somescript.php?somevar=somevalue",
dataType: "jsonp",
jsonp: 'callback',
success: function(data) 
alert('Done!');

);

然后您可以检查$_SERVER['REQUEST_URI'] 变量,或者简单地检查$_GET['callback']$_GET['_']。 REQUEST_URI 将如下所示:

/somescript.php?somevar=somevalue&callback=jQuery172028849187534502896_1333494007273&_=1333494443880

编辑:下面的答案是判断是否是跨域的,而不是检查是否是AJAX

“如何确定 ajax 调用是否来自不同的域”问题的答案是这样的:

我正在使用 jQuery.ajax 调用,对我来说使用变量 $_SERVER['HTTP_REFERER'] 可以正常工作。

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

如果我正在使用 Internet 上的页面,$_SERVER['HTTP_REFERER'] 的值会返回进行 ajax 调用的页面的 URL。所以检查 this 的值可以告诉你你需要知道什么。

【讨论】:

我意识到我可能误解了这个问题。我认为问题是如何检测 Ajax 请求是否来自不同的域。现在我将这个问题解释为“如何检测它是否是 ajax 请求”。 我现在已经编辑了这篇文章,很重要,以改进答案。这次是回答正确的问题。 $_SERVER['HTTP_ACCEPT'] 的值也可能值得研究。这取决于是使用 Ajax 还是直接访问 somescript.php。【参考方案3】:

使用 $_SERVER['HTTP_ORIGIN'] 获取请求域

【讨论】:

【参考方案4】:

要检测 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);

【讨论】:

以上是关于如何在php中检测ajax跨域请求的主要内容,如果未能解决你的问题,请参考以下文章

PHP处理Ajax请求与Ajax跨域

ajax跨域请求解决方案

如何解决ajax跨域问题

解决ajax跨域的办法,代理,cors,jsonp

跨域 Ajax 调用与 php 请求 [重复]

如何解决 Ajax 跨域请求不到的问题