首页 文章

Access-Control-Allow-Origin不允许使用Origin

提问于
浏览
310

我在Sencha Touch 2应用程序(包含在PhoneGap中)中创建 Ajax.request 到远程PHP服务器 .

服务器的响应如下:

XMLHttpRequest无法加载http://nqatalog.negroesquisso.pt/login.php . Access-Control-Allow-Origin不允许使用origin http:// localhost:8888 .

我该如何解决这个问题?

22 回答

  • 1

    当您收到请求时,您可以

    var origin = (req.headers.origin || "*");
    

    比你必须做出回应的那样:

    res.writeHead(
        206,
        {
            'Access-Control-Allow-Credentials': true,
            'Access-Control-Allow-Origin': origin,
        }
    );
    
  • 10

    通配符不是't a very safe option. You' d希望它更具体 - 请查看我在同一问题上写的答案; how to bypass Access-Control-Allow-Origin?

  • 7

    在Ruby Sinatra

    response['Access-Control-Allow-Origin'] = '*'
    

    适合所有人或

    response['Access-Control-Allow-Origin'] = 'http://yourdomain.name'
    
  • 5
    **Add this meta tag in your Webservice**
    
    
     header('Content-type: application/json');
     header('Access-Control-Allow-Origin: *');
    
  • 60

    我前一段时间写了一篇关于这个问题的文章,Cross Domain AJAX .

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

    Access-Control-Allow-Origin: *
    

    这将允许跨域Ajax . 在PHP中,您需要修改响应,如下所示:

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

    您可以将 Header set Access-Control-Allow-Origin * 设置放在Apache配置或htaccess文件中 . 它就像一个魅力 .

    从评论中,这是一个重要的注释:通配符将允许任何域向您的主机发送请求 . 我建议使用您将在其上运行脚本的特定域替换星号 .

  • 7

    如果您 don't 拥有对服务器的控制权,您只需将此参数添加到Chrome启动器: --disable-web-security .

    请注意,我不会将此用于普通"web surfing" . 供参考,请参阅这篇文章:Disable same origin policy in Chrome .

    您可以使用Phonegap实际构建应用程序并将其加载到设备上,这不是问题 .

  • 5

    如果你正在使用Apache,只需添加:

    <ifModule mod_headers.c>
        Header set Access-Control-Allow-Origin: *
    </ifModule>
    

    在您的配置中 . 这将导致您的网络服务器的所有回复都可以从互联网上的任何其他网站访问 . 如果您打算仅允许特定服务器使用主机上的服务,则可以将 * 替换为原始服务器的URL:

    Header set Access-Control-Allow-Origin: http://my.origin.host
    
  • -1

    如果您有ASP.NET / ASP.NET MVC应用程序,则可以通过Web.config文件包含此标头:

    <system.webServer>
      ...
    
        <httpProtocol>
            <customHeaders>
                <!-- Enable Cross Domain AJAX calls -->
                <remove name="Access-Control-Allow-Origin" />
                <add name="Access-Control-Allow-Origin" value="*" />
            </customHeaders>
        </httpProtocol>
    </system.webServer>
    
  • 5

    如果使用chrome,您只需从chrome商店安装chrome扩展即可解决与CORS相关的问题 .

    扩展名: Allow-Control-Allow-Origin 链接:[https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en][1]

  • 6

    这是我尝试使用ASP.NET MVC作为数据源解决同一问题时出现的第一个问题/答案 . 我意识到这并没有解决PHP问题,但它足够有 Value .

    我正在使用ASP.NET MVC . blog post from Greg Brant为我工作 . 最后,您创建一个属性 [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")] ,您可以将其添加到控制器操作中 .

    例如:

    public class HttpHeaderAttribute : ActionFilterAttribute
    {
        public string Name { get; set; }
        public string Value { get; set; }
        public HttpHeaderAttribute(string name, string value)
        {
            Name = name;
            Value = value;
        }
    
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.AppendHeader(Name, Value);
            base.OnResultExecuted(filterContext);
        }
    }
    

    然后使用它:

    [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
    public ActionResult MyVeryAvailableAction(string id)
    {
        return Json( "Some public result" );
    }
    
  • 41

    由于Matt Mombrea对于服务器端是正确的,您可能会遇到另一个问题,即白名单拒绝 .

    您必须配置phonegap.plist . (我使用旧版本的phonegap)

    对于cordova,命名和目录可能会有一些变化 . 但步骤应该大致相同 .

    首先选择支持文件> PhoneGap.plist

    enter image description here

    然后在“ExternalHosts”下

    添加一个条目,其值可能为“http://nqatalog.negroesquisso.pt”我正在使用*仅用于调试目的 .

    enter image description here

  • 1
  • 9

    对于需要对引荐来源的“www”和“非www”版本进行例外处理的任何人来说,这可能很方便:

    $referrer = $_SERVER['HTTP_REFERER'];
     $parts = parse_url($referrer);
     $domain = $parts['host'];
    
     if($domain == 'google.com')
     {
             header('Access-Control-Allow-Origin: http://google.com');
     }
     else if($domain == 'www.google.com')
     {
             header('Access-Control-Allow-Origin: http://www.google.com');
     }
    
  • 1

    我将为您提供一个简单的解决方案 . 在我的情况下,我无法访问服务器 . 在这种情况下,您可以更改Google Chrome浏览器中的安全策略以允许Access-Control-Allow-Origin . 这很简单:

    • 创建Chrome浏览器快捷方式

    • 右键单击快捷图标 - >属性 - >快捷方式 - >目标

    简单粘贴 "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security .

    位置可能不同 . 现在点击该快捷方式打开Chrome .

  • 5

    在使用各种API时,我已经遇到过这种情况 . 通常快速修复是将"&callback=?"添加到字符串的末尾 . 有时&符号必须是字符代码,有时候是"?":"?callback=?"(见Forecast.io API Usage with jQuery

  • 4

    如果're writing a Chrome Extension and get this error, then be sure you have added the API'是 manifest.jsonpermissions block的基本URL,例如:

    "permissions": [
        "https://itunes.apple.com/"
    ]
    
  • 0

    如果你在apache下,只需使用以下内容将.htaccess文件添加到你的目录:

    Header set Access-Control-Allow-Origin: *
    
    Header set Access-Control-Allow-Headers: content-type
    
    Header set Access-Control-Allow-Methods: *
    
  • 7

    这是因为same-origin policy . 在Mozilla Developer NetworkWikipedia查看更多信息 .

    基本上,在您的示例中,您只需要从 nqatalog.negroesquisso.pt 加载 http://nqatalog.negroesquisso.pt/login.php 页面,而不是 localhost .

  • 6

    Ruby on Rails中,您可以在控制器中执行以下操作:

    headers['Access-Control-Allow-Origin'] = '*'
    
  • 361

    您可以通过在HTTP OPTIONS的响应中包含 Headers Access-Control-Allow-Origin: * 来修改服务器,从而使其无需修改服务器 .

    在Chrome中,使用this extension . 如果你在Mozilla上,请检查this answer .

  • 16

    如果你在Angular.js中得到这个,那么请确保你逃脱你的端口号这个:

    var Project = $resource(
        'http://localhost\\:5648/api/...', {'a':'b'}, {
            update: { method: 'PUT' }
        }
    );
    

    有关详细信息,请参阅here .

  • 15

    在chrome中测试的phonegap应用程序也存在同样的问题 . 在打开Chrome之前,我们每天在批处理文件下面使用一台Windows机器请记住,在运行此操作之前,您需要清除任务管理器中的所有chrome实例,或者您可以选择chrome以不在后台运行 .

    批处理:(使用cmd)

    cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security
    

相关问题