如何在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跨域请求的主要内容,如果未能解决你的问题,请参考以下文章