2010-09-09 63 views
1

我在使用任何浏览器时都遇到了一个奇怪的问题。当我使用JSON文件从本地计算机向外部网站发送请求时。尽管指定了GET,Apache仍会收到OPTIONS请求而不是GET。经过一番研究后,它看起来像是一个跨站点请求问题,然而,我发现大多数文章的旧/ bug已经修复。有没有人有任何想法,为什么会发生这种情况以及如何解决。尽管GET被设置,但jquery JSON发出OPTIONS请求

感谢

$.ajax({ 
type: 'GET', 
url: http://mywebsite.com/getjsn.json, 
dataType: "json", 
cache: false, 
success: function(data, textStatus, XMLHttpRequest) { 
    // do something. 
}, 
error: function(XMLHttpRequest, textStatus, errorThrown) { 
    // deal with error. 
}, 
complete: function(XMLHttpRequest, textStatus) { 
    // all done. 
} 
}); 

asdasd

回答

2

我建议你看看http://api.jquery.com/jQuery.ajax/,特别是在关于JSONP交易。当您从外部网站加载JSON时,您必须以不同方式构建您的请求。您可能需要调整您的服务器以适应此情况。结束通话看起来更像这样。

$.ajax({ 
    url: 'http://mywebsite.com/getjson.json?callback=?', 
    dataType: 'jsonp', 
    success: function(data) { 
     // do something. 
    } 
}); 

至于“OPTIONS”请求本身,我相信这是developer.mozilla.org/En/HTTP_access_control解释。我想詹姆斯正在使用一个现代浏览器,并且该浏览器试图询问目标服务器是否允许该请求。尽管这在所有的浏览器中都不支持,所以我仍然建议我以前的解决方案。

+0

这并不能解释为什么一个'HTTP请求GET'会来作为一个HTTP' OPTIONS'请求。 jQuery没有设置任何类型。 – 2010-09-09 14:46:58

+0

您是否检查过“发送”到服务器的标题?如果不是,请这样做并附加到您的OP – RobertPitt 2010-09-09 14:54:15

+4

我相信这在https://developer.mozilla.org/En/HTTP_access_control中有解释。我想詹姆斯正在使用一个现代浏览器,并且该浏览器试图询问目标服务器是否允许该请求。尽管这在所有的浏览器中都不支持,所以我仍然建议我以前的解决方案。 – BBonifield 2010-09-09 15:06:54

0

选项请求由浏览器完成,作为跨站点脚本攻击的保护措施。 JavaScript并不知道它发生过,它是浏览器在做它。如果您的请求来自不同的域,则需要让服务器返回正确的访问控制标头。如果获取请求来自同一个域,则永远不会看到选项请求。

对于一切通过index.php文件传送,类似于这样开头的网站将工作:

 
if (PHP_SAPI != 'cli'){ 
    $allowed = array('http://domainyouwantthebrowertobeabletocomefrom.com', 'http://blabla.com'); 
    if (isset($_SERVER['HTTP_ORIGIN'])){ 
     if (in_array($_SERVER['HTTP_ORIGIN'], $allowed) OR substr($_SERVER['HTTP_ORIGIN'], -11) == 'netmark.dev'){ 
      header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
      header("Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS"); 
      header('Access-Control-Allow-Headers: accept, stamp, signature, x-requested-with, origin, content-type'); 
      header('Access-Control-Allow-Credentials: true'); 
      header('Access-Control-Max-Age: 300'); 
     } 
    } 
    if (strtoupper($_SERVER['REQUEST_METHOD']) == 'OPTIONS') { 
     exit; 
    } 
}