Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jquery JSON在设置GET的情况下发出选项请求_Javascript_Jquery_Apache_Json_Http - Fatal编程技术网

Javascript jquery JSON在设置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"

在使用任何浏览器时,我在Windows上遇到了一个奇怪的问题。当我使用JSON文件从本地计算机向外部网站发出请求时。尽管指定了GET,Apache还是会收到一个OPTIONS请求而不是GET。经过一些研究,这看起来像是一个跨站点的请求问题,然而,我发现的大多数文章中,旧的/错误已经被修复。有人知道为什么会发生这种情况以及如何解决吗

谢谢

$.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使用的是一个现代浏览器,该浏览器试图询问目标服务器是否应该允许该请求。但并非所有浏览器都支持这一点,因此我仍然建议使用我以前的解决方案。很好!这应该成为你的答案,它是非常有益的。