访问控制 - 允许来源不允许来源

问题描述:

我正在向Sencha Touch 2应用程序(包装在PhoneGap中)中的远程PHP服务器制作Ajax.request访问控制 - 允许来源不允许来源

来自服务器的响应如下:

的XMLHttpRequest不能加载http://nqatalog.negroesquisso.pt/login.php。 Access-Control-Allow-Origin不允许原产地http://localhost:8888

我怎样才能解决这个问题?

+16

而使用jQuery,设置'数据类型: 'JSONP','不顺便特技 – amit 2012-10-11 12:45:29

+9

不是从所述响应服务器。准确地说,错误发生在客户端。 – matteo 2013-02-01 17:41:34

+2

jsonp技巧可能不再工作,fyi:http://*.com/questions/12216208/chrome-now-blocking-all-jsonp-requests-from-https-to-http – drewww 2013-08-19 18:30:02

我就这个问题写了一篇文章而回,Cross Domain AJAX

如果你有响应的服务器的控制权来处理最简单的方法是添加一个响应头为:

Access-Control-Allow-Origin: * 

这将允许跨域Ajax。在PHP中,你将要修改的响应,像这样:

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

你可以只是把Header set Access-Control-Allow-Origin *设置在Apache配置或htaccess文件。它就像一个魅力。

从评论,这是一个重要的说明:通配符将允许任何域发送请求到您的主机。我建议将星号替换为您将在上运行脚本的特定域。

+4

我会联系我的服务器提供商。谢谢 – Ricardo 2012-04-13 15:04:52

+7

这是否有任何安全问题?例如,[本答案](http://*.com/a/9327231/1431728)表示,“由于安全原因,JavaScript受到”相同来源策略“的限制。例如,恶意脚本无法联系远程服务器并从您的网站发送敏感数据。“ – JohnK 2012-11-02 18:14:43

+4

真棒,我只是把它放在我的node.js服务器文件中: response.writeHead(200,{'Content-Type':contentType,'Access-Control-Allow-Origin':'*'}); 它的工作。谢谢! – vbullinger 2012-11-29 04:33:38

这是因为same-origin policy。请参阅Mozilla Developer NetworkWikipedia

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

+1

但我需要从移动设备加载web服务,我会绕过这个? – Ricardo 2012-04-13 14:54:42

+0

那么你需要做一些服务器端的更改或使用JSONP http://en.wikipedia.org/wiki/JSONP – antyrat 2012-04-13 14:55:50

如果你不要有控制服务器,你可以简单地添加这个参数到你的Chrome启动器:--disable-web-security

注意,我不会用这个正常的“网上冲浪”。作为参考,看到这个职位:Disable same origin policy in Chrome

您使用Phonegap实际构建应用程序并将其加载到设备上,这不会是一个问题。

+0

谢谢。但我的应用程序运行在移动设备上,我无法将参数传递给我的webview包装器。 – Ricardo 2012-04-13 16:52:58

+0

不要先在浏览器中测试你的应用程序吗?你如何调试? – 2012-04-13 17:33:39

+0

是的,我在Chrome浏览器中调试,但该应用程序不会在Chrome上运行。这将是我无法控制的电话webview女巫。 – Ricardo 2012-04-16 10:25:50

马特Mombrea是服务器端是正确的,你可能会遇到被拒绝列入白名单的另一个问题。

你必须配置你的phonegap.plist。 (我正在使用老版本的phonegap)

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

首先选择支持文件> PhoneGap。plist中

enter image description here

然后在 “ExternalHosts”

添加一个条目,带有也许 “http://nqatalog.negroesquisso.pt” 我使用的是值*仅用于调试目的。

enter image description here

+0

谢谢你的时间。 – Ricardo 2012-04-23 08:49:44

如果你使用Apache只需添加:

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

在您的配置。这将导致您的网络服务器的所有响应都可以从互联网上的任何其他站点访问。

Header set Access-Control-Allow-Origin: http://my.origin.host 
+3

不要忘了加载模块:a2enmod头 – 2012-10-25 13:58:27

+0

如何加载模块:a2enmod头? – Ayesha 2015-12-16 16:10:31

我曾与各种工作时,碰上了几次:如果您打算只允许通过特定的服务器使用主机上的服务,您可以与发信服务器的URL替换*蜜蜂。通常快速修复是添加“& callback =?”到一个字符串的末尾。有时,&符号必须是字符代码,有时候是“?”:“?callback =?” (请参阅Forecast.io API Usage with jQuery

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

批次:(使用CMD)

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

如果你得到这个Angular.js,然后确保你逃避你这样的端口号:

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

更多信息,请参见here上它。

这是第一个问题/答案试图解决使用ASP.NET MVC作为我的数据源的同样的问题时弹出我。我意识到这并不能解决PHP的问题,但它足够有价值。

我正在使用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"); 
} 
+1

WebApi 2现在已内置此功能。 http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api – 2014-01-26 14:17:10

这可能是很方便的人谁需要一个例外都“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'); 
} 
+0

我指出在解决ACAO误差与蔚蓝的正确方向。虽然我已经添加了允许的Google主机名。使用的URL需要为https:// googledrive/NOT https://www.googledrive/ – Kildareflare 2013-11-12 00:54:10

如果你有一个ASP.NET/ASP.NET MVC应用,你可以通过网页包含这个头文件。配置文件:

<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> 
+1

.NET MVC People,请点击此处!我实际上会打出一个解决方案,并在我的博客上指出这个答案,以便人们可以更轻松地找到答案。没有比尝试通过.NET/MVC障碍更糟糕的事情,除了PHP/jQuery解决方案之外没有任何东西可以找到。谢谢@ Caio-Proiete – ottoflux 2013-11-04 14:02:51

+1

这是怎么回事?我使用的是Chrome,并试图从我的本地主机访问雅虎财经页面。 – newman 2014-07-07 18:13:52

+1

感谢它为我工作。我已经在服务器端代码项目(web.config)中添加了。 – ethem 2015-03-19 23:13:02

Ruby on Rails,你可以在控制器里做:

headers['Access-Control-Allow-Origin'] = '*' 
+0

如果是ajax调用,你把这个控制器放在哪里?我能看到更多的代码上下文吗? – rigdonmr 2016-10-12 21:56:56

我会给你这一个简单的解决方案。在我的情况下,我无法访问服务器。在这种情况下,您可以更改您的Google Chrome浏览器中的安全策略以允许访问控制允许来源。这是非常简单的:

  1. 创建一个Chrome浏览器快捷方式
  2. 右键点击快捷方式图标 - >属性 - >快捷方式 - >目标

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

该位置可能会有所不同。现在点击该快捷方式打开Chrome。

+1

禁用网络安全似乎不是理想的解决方案... – kdazzle 2014-03-11 22:12:44

如果你正在写一个Chrome扩展,并得到这个错误,那么可以肯定你已经添加了API的基础URL到您的manifest.jsonpermissions block,例如:

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

当您收到请求您可以

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

当你不得不用的反应类似的东西去比:

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

您可以通过在HTTP OPTIONS的响应中创建包括头文件Access-Control-Allow-Origin: *的浏览器来修改服务器而无需修改服务器。在Chrome中使用this extension。如果你在Mozilla检查this answer

+0

非常感谢.... – 2016-08-22 14:47:51

通配符不是一个非常安全的选项。你会希望它更具体 - 检查我在这里写的关于同一问题的答案; how to bypass Access-Control-Allow-Origin?

在Ruby Sinatra

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

为大家或

response['Access-Control-Allow-Origin'] = 'http://yourdomain.name' 

+2

这个插件本地工作,但如果客户访问你的应用程序没有它,它是毫无价值的。 – 2016-08-04 02:11:09

,如果你是在Apache,只需添加一个。htaccess文件目录与此内容:

页眉设置访问控制允许来源:*

页眉设置访问控制允许报头:内容类型

页眉设置访问控制 - 允许的方法:*

**Add this meta tag in your Webservice** 


header('Content-type: application/json'); 
header('Access-Control-Allow-Origin: *'); 

如果对铬你可以简单地从安装Chrome网上应用店 浏览器扩展程序来解决相关问题CORS工作。

扩展:允许-控制允许来源 链接:[https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en][1]