代码之家  ›  专栏  ›  技术社区  ›  Drew Noakes

XmlHttpRequest错误:访问控制不允许原点为null允许原点

  •  522
  • Drew Noakes  · 技术社区  · 15 年前

    我正在开发一个页面,通过jQuery的AJAX支持从Flickr和Panoramio中提取图像。

    Flickr的工作很好,但是当我尝试 $.get(url, callback) 在Panoramio中,我看到Chrome控制台中有一个错误:

    无法加载XMLHttpRequest http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150 . 访问控制允许原点不允许原点为空。

    如果我直接从浏览器中查询这个URL,就可以了。怎么了,我能绕开这件事吗?我是否编写了错误的查询,或者这是Panoramio所做的事情阻碍了我的尝试?

    error message .

    编辑

    下面是一些显示问题的示例代码:

    $().ready(function () {
      var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';
    
      $.get(url, function (jsonp) {
        var processImages = function (data) {
          alert('ok');
        };
    
        eval(jsonp);
      });
    });
    

    你可以 run the example online .

    编辑2

    多亏了达林的帮助。 改用这个:

    $().ready(function () {
      var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';
    
      $.get(url, function (data) {
        // can use 'data' in here...
      });
    });
    
    16 回复  |  直到 5 年前
        1
  •  431
  •   ssokolow    14 年前

    坦白说,据我所知,你有两个问题:

    1. 您没有将“jsonp”类型说明符传递给 $.get ,所以它使用的是普通的XMLHttpRequest。但是,您的浏览器支持CORS(跨源站资源共享),以便在服务器发出请求时允许跨域XMLHttpRequest。这就是 Access-Control-Allow-Origin 头球进了。

    2. 我相信你说过你是从一个文件运行它的。CORS报头有两种方式来表示跨域XHR正常。一是送 Access-Control-Allow-Origin: * (如果您通过 $。获取 Origin 标题。然而, file:// URL产生空值 起源 无法通过回显进行授权。

    $.getJSON . 如果它看到子字符串,它就可以将请求类型从默认的“json”更改为“jsonp” callback=? 在URL中。

    这解决了第二个问题,不再尝试执行来自

    为了向其他人澄清,以下是简单的故障排除说明:

      • 你用的是 $。获取 并设置 dataType jsonp .
      • 你用的是 包括 回调=? 在URL中。
    1. 如果您试图通过CORS执行跨域XMLHttpRequest。。。
      1. 确保您正在通过 http:// 文件:// 对CORS的支持有限。
      2. actually supports CORS . (Opera和Internet Explorer迟到了)
        2
  •  77
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

    您可能需要在调用的脚本中添加一个头,下面是我在PHP中必须做的:

    header('Access-Control-Allow-Origin: *');
    

    更多详细信息请参见 Cross domain AJAX ou services WEB (法语)。

        3
  •  73
  •   Peter Mortensen Pieter Jan Bonestroo    14 年前

    对于简单的HTML项目:

    cd project
    python -m SimpleHTTPServer 8000
    

    然后浏览你的文件。

        4
  •  21
  •   Darin Dimitrov    15 年前

    $.get('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
    function(json) {
        alert(json.photos[1].photoUrl);
    });
    

    我也建议你使用 $.getJSON() 方法,因为前面的方法在IE8上不起作用(至少在我的机器上是这样):

    $.getJSON('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150', 
    function(json) {
        alert(json.photos[1].photoUrl);
    });
    

    你可以试试 online from here .


    更新:

    现在你已经展示了你的代码,我可以看到它的问题。您同时拥有匿名函数和内联函数,但两者都将被调用 processImages . jQuery的JSONP支持就是这样工作的。注意我是如何定义 callback=? about it in the documentation .

    另一句话是你不应该打电话给eval。传递给匿名函数的参数已经被jQuery解析为JSON。

        5
  •  9
  •   Ahmad Awais    9 年前

        6
  •  6
  •   Quentin    15 年前

    这是最重要的 same origin policy ,则必须使用JSON-P接口或在同一主机上运行的代理。

        7
  •  6
  •   DontVoteMeDown    12 年前

    如果您正在进行本地测试或从以下位置调用文件 file://

    在MAC上: open -a Google\ Chrome --args --disable-web-security

        8
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    14 年前

    我们通过 http.conf 文件(已编辑,然后重新启动HTTP服务):

    <Directory "/home/the directory_where_your_serverside_pages_is">
        Header set Access-Control-Allow-Origin "*"
        AllowOverride all
        Order allow,deny
        Allow from all
    </Directory>
    

    Header set Access-Control-Allow-Origin "*" ,您可以放置一个精确的URL。

        9
  •  4
  •   Peter Mortensen Pieter Jan Bonestroo    14 年前

    在我的例子中,同样的代码在Firefox上运行得很好,但在GoogleChrome上却不行。谷歌Chrome的JavaScript控制台说:

    XMLHttpRequest cannot load http://www.xyz.com/getZipInfo.php?zip=11234. 
    Origin http://xyz.com is not allowed by Access-Control-Allow-Origin.
    Refused to get unsafe header "X-JSON"
    

    我不得不删除ajaxurl的www部分,使其与源URL正确匹配,然后就可以正常工作了。

        10
  •  2
  •   Ahmad Awais    9 年前

    function AjaxFeed(){
    
        return $.ajax({
            url:            'http://somesite.com/somejsonfile.php',
            data:           {something: true},
            dataType:       'jsonp',
    
            /* Very important */
            contentType:    'application/json',
        });
    }
    
    function GetData() {
        AjaxFeed()
    
        /* Everything worked okay. Hooray */
        .done(function(data){
            return data;
        })
    
        /* Okay jQuery is stupid manually fix things */
        .fail(function(jqXHR) {
    
            /* Build HTML and update */
            var data = jQuery.parseJSON(jqXHR.responseText);
    
            return data;
        });
    }
    
        11
  •  1
  •   imilbaev    14 年前

    我使用Apache服务器,所以我使用mod\u代理模块。启用模块:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    

    然后添加:

    ProxyPass /your-proxy-url/ http://service-url:serviceport/
    

        12
  •  1
  •   user2688838    12 年前

    作为最后一个音符 Mozilla documentation explicitly says

    如果标头通配符为: 访问控制允许原点:*。 因为访问控制允许Origin显式地提到 http://foo.example 凭证识别的内容被返回到调用web 内容。

    因此,使用“*”不仅是一种不好的做法。根本不起作用:)

        13
  •  1
  •   Tyler    6 年前

    对于PHP-这是我在Chrome、safari和firefox上的工作

    https://w3c.github.io/webappsec-cors-for-developers/#avoid-returning-access-control-allow-origin-null

    header('Access-Control-Allow-Origin: null');
    

    使用axios调用带有文件的php live服务://

        14
  •  0
  •   mslembro    12 年前

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
    RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
    
        15
  •  0
  •   Ganesh Kamath - 'Code Frenzy'    12 年前

    确保您使用的是JQuery的最新版本。我们在jquery1.10.2中遇到了这个错误,在使用jquery1.11.1之后,这个错误得到了解决

        16
  •  0
  •   andymenon    11 年前

    各位,

    文本框 的选项卡 标题 在Fiddler的第节中,错误消息声明如下:

    不能以正斜杠结尾。”

    我删除了CORS代码中的正斜杠,重新编译了webapi,现在API可以通过Chrome和internetexplorer访问,没有任何问题。请试一试。

    安迪

        17
  •  0
  •   MiJyn    8 年前

    解决方案中有一个小问题 by CodeGroover above

    this one 使用方法:

    sudo npm -g install simple-http-server # to install
    nserver # to use
    

    然后它将在 http://localhost:8000