Javascript jquery JSON在设置GET的情况下发出选项请求
在使用任何浏览器时,我在Windows上遇到了一个奇怪的问题。当我使用JSON文件从本地计算机向外部网站发出请求时。尽管指定了GET,Apache还是会收到一个OPTIONS请求而不是GET。经过一些研究,这看起来像是一个跨站点的请求问题,然而,我发现的大多数文章中,旧的/错误已经被修复。有人知道为什么会发生这种情况以及如何解决吗 谢谢Javascript jquery JSON在设置GET的情况下发出选项请求,javascript,jquery,apache,json,http,Javascript,Jquery,Apache,Json,Http,在使用任何浏览器时,我在Windows上遇到了一个奇怪的问题。当我使用JSON文件从本地计算机向外部网站发出请求时。尽管指定了GET,Apache还是会收到一个OPTIONS请求而不是GET。经过一些研究,这看起来像是一个跨站点的请求问题,然而,我发现的大多数文章中,旧的/错误已经被修复。有人知道为什么会发生这种情况以及如何解决吗 谢谢 $.ajax({ type: 'GET', url: http://mywebsite.com/getjsn.json, dataType: "json"
$.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我建议您查看,特别是关于JSONP事务。当您从外部网站加载JSON时,您必须以不同的方式构造您的请求。您可能还需要调整服务器以适应这种情况。结束通话看起来更像这样
$.ajax({
url: 'http://mywebsite.com/getjson.json?callback=?',
dataType: 'jsonp',
success: function(data) {
// do something.
}
});
至于“选项”请求本身,我相信这在developer.mozilla.org/En/HTTP_access_control中有解释。我想象James使用的是一个现代浏览器,该浏览器试图询问目标服务器是否应该允许该请求。但并非所有浏览器都支持这一点,因此我仍然建议使用以前的解决方案。选项请求由浏览器完成,作为跨站点脚本攻击的保护措施。Javascript不知道它曾经发生过,是浏览器在做这件事。如果您的请求来自不同的域,则需要让服务器返回正确的访问控制头。如果get请求来自同一个域,您将永远看不到options请求 对于所有内容都通过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; } } 如果(PHP_SAPI!=“cli”){ $allowed=数组('http://domainyouwantthebrowertobeabletocomefrom.com', 'http://blabla.com'); 如果(isset($\u服务器['HTTP\u源'])){ 如果(在_数组($_服务器['HTTP_-ORIGIN'],允许使用$)或substr($_服务器['HTTP_-ORIGIN'],-11)='netmark.dev'){ 标头(“访问控制允许源代码:{$\u服务器['HTTP_源代码']}”); 标题(“访问控制允许方法:POST、GET、PUT、DELETE、OPTIONS”); 标题(‘访问控制允许标题:接受、盖章、签名、x请求、来源、内容类型’); 标头('访问控制允许凭据:true'); 标题(‘访问控制最大年龄:300’); } } if(strtoupper($\u服务器['REQUEST\u METHOD'])=='OPTIONS'){ 出口 } }
这并不能解释为什么
httpget
请求会以httpoptions
请求的形式出现。jQuery没有设置任何排序。您是否检查了“发送”到服务器的标题?如果没有,请这样做,并将其附加到您的OPI中,请相信这已在中进行了解释。我想象James使用的是一个现代浏览器,该浏览器试图询问目标服务器是否应该允许该请求。但并非所有浏览器都支持这一点,因此我仍然建议使用我以前的解决方案。很好!这应该成为你的答案,它是非常有益的。