Access-Control-Allow-Origin 不允许 XMLHttpRequest 无法加载

Posted

技术标签:

【中文标题】Access-Control-Allow-Origin 不允许 XMLHttpRequest 无法加载【英文标题】:XMLHttpRequest cannot load is not allowed by Access-Control-Allow-Origin 【发布时间】:2013-06-14 03:32:50 【问题描述】:

我正在尝试访问 education.com API 数据。但是,我不断收到错误状态的错误消息:

XMLHttpRequest 无法加载 http://api.education.com/service/service.php?f=schoolSearch&key=mykey&sn=sf&v=4&city=Atlanta&state=ga&Resf=json。 Access-Control-Allow-Origin 不允许 Origin。

我的代码如下:

$(function()
    $.getJSON('http://api.education.com/service/service.php?f=schoolSearch&key=mykey&sn=sf&v=4&city=Atlanta&state=ga&Resf=json', 
    function(data) 
        console.log(data);
    );
);

有人可以帮帮我吗?

【问题讨论】:

该api是否接受jsonp回调参数?目前似乎没有。如果没有,您不能单独使用浏览器请求它。 这个很全面3 simple solutions 尝试跨域...检查pureexample.com/jquery/cross-domain-ajax.html 【参考方案1】:

一篇关于Cross Domain AJAX的文章不久前在这里发布:

CROSS DOMAIN AJAX REQUEST WITH JSON RESPONSE FOR IE,FIREFOX,CHROME, SAFARI – JQUERY

如果您可以控制响应服务器,处理此问题的最简单方法是为以下内容添加响应标头:

Access-Control-Allow-Origin: *

这将允许跨域 AJAX。在 PHP 中,您需要像这样修改响应:

<?php header('Access-Control-Allow-Origin: *'); ?>

您可以将 Header 设置 Access-Control-Allow-Origin * 设置在 apache conf 或 htaccess 文件中,它就像一个魅力一样工作

重要提示: 通配符将允许任何域向您的主机发送请求。我建议将星号替换为您将在其上运行脚本的特定域。

【讨论】:

不幸的是,我无法控制响应服务器。 ://【参考方案2】:

除非education.com 服务器配置为允许CORS (Cross-Origin Resource Sharing) 请求(即Access-Control-Allow-Origin 位),否则您无法使用浏览器执行此操作。

但是,您的服务器可以代表您发出请求,然后您可以从那里检索数据。

【讨论】:

【参考方案3】:

在ZF1中可以做如下:

  public function indexAction() 
    $turnkey = array(
        "uris" => array("176.x.x:3478", "3478"),
        "username" => "my_username",
        "password" => "my_password"
    );

    $content = Zend_Json::encode($turnkey);
    $this->getResponse()
            ->setHeader('Access-Control-Allow-Origin', "*")
            ->setHeader('Content-Type', 'application/json')
            ->setBody($content)
            ->sendResponse();
    exit;
  

【讨论】:

【参考方案4】:

与其说是解决问题的方法,不如说是避免问题的技巧——在没有网络安全的情况下启动浏览器:

in MacOS this would work as follows: cd to ../../Applications/Google\ Chrome.app/Contents/MacOS
then start the brwoser with the appropiate flag: Google\ Chrome --disable-web-security'

注意:切勿使用浏览器进行正常上网,这只是为了在紧急情况下帮助您! 干杯

【讨论】:

在 Linux 中运行 google-chrome --disable-web-security 并不能解决这个问题。如果这真的适用于 Mac,我会感到惊讶......

以上是关于Access-Control-Allow-Origin 不允许 XMLHttpRequest 无法加载的主要内容,如果未能解决你的问题,请参考以下文章

PHP没有按顺序执行

跨域请求被阻止 Symfony/AngularJS

C# MVC js 跨域

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案

PHP Ajax 跨域问题最佳解决方案