【问题标题】:How to detect ajax cross domain request in php如何在php中检测ajax跨域请求
【发布时间】: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'],也许是更好的解决方案。

标签: php ajax cross-domain jsonp


【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2012-04-15
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多