CORS,Cordova,AngularJs $ http和file://混乱

时间:2014-09-18 13:28:38

标签: javascript ajax angularjs cordova cors

我有一个AngularJS / Cordova应用程序,用于在远程服务器上轮询JSON服务:

$http({method: 'GET', url: 'http://example.com/index.php'})

在浏览器中进行开发并运行我的Intranet apache服务器(http://dev)我得到了" No' Access-Control-Allow-Origin'标题存在"所以我通过添加:

来解决这个问题
Header set Access-Control-Allow-Origin "http://dev"

一切正常,我在Chrome开发工具中看到Origin:http://dev

所以,不得不首次考虑这个问题,我想知道当应用程序在Android / iOS网页浏览器中运行时Origin会是什么。我决定在我的设备上进行构建和部署,并期望在远程调试中看到相同的错误(适用于iOS的Safari和适用于Android的Weinre),但令我惊讶的是它可以工作(不发送任何CORS标头)!我还发现,在两个设备中,应用程序都在webview下以file://方案运行,而不是(我假设的)手机操作系统提供的某些类型的http服务器。

所以研究似乎表明文件不需要CORS:// - 这样一个"网站'可以访问任何域上的任何XHR资源。但是,当我在桌面浏览器上测试时,我发现虽然Safari不需要CORS for file://但Chrome确实如此,FireFox可以在没有CORS的情况下工作

所以我的问题:

1)为什么我的应用程序在Android / iOS中没有CORS工作 - 是因为CORS不适用于file://,或者,Cordova是否正在做一些事情以使其在设备中运行?

我的配置中有<access origin="*"/>

2)如果,Q1的待定答案,我应该想要在安全的网站上并明确允许来自应用程序的请求,你为file://&#34; hosts&提供了Access-Control-Allow-Origin的价值#34 ;?在我的调试中,来自file://

的请求中没有Origin头

3)除了阻止对远程服务器的XHR请求外,Chrome还会阻止我的应用模板(我使用单独的文件),请参阅下文。这是我的应用程序的潜在问题,还是我不需要担心的Chrome问题?

XMLHttpRequest cannot load file:///Volumes/projects/phonegap/www/templates/tabs.html. Cross origin requests are only supported for HTTP. 

1 个答案:

答案 0 :(得分:27)

CORS标头有两种方式表示应允许跨域XHR:

  • 发送Access-Control-Allow-Origin: *(允许所有主机)
  • 将您希望允许的主机放入后端的Origin标头中

对于file://网址,他们会生成 null Origin,但无法通过第二个选项授权( echo-back )。

作为mentioned

  

跨域策略不适用于PhoneGap(出于各种原因,主要是因为您的应用实际上是在文件上运行:// URI on-device)。

     

请注意,您必须为应用设置白名单才能访问这些外部域。

至于 Chrome 问题,可在开发者控制台中看到:

Failed to load resource: net::ERR_FILE_NOT_FOUND file:///C:/2.html XMLHttpRequest cannot load file:///C:/2.html. Received an invalid response. Origin 'null' is therefore not allowed access.

Chromium project's issue tracker, #40787进行了讨论。他们将问题标记为赢得修复,因为这种行为正在按设计发生。

提出了一种解决方法,只需在Chrome中关闭CORS以进行开发,并使用--allow-file-access-from-files --disable-web-security启动chrome

e.g。对于Windows

`C:\Users\YOUR_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files --disable-web-security`

以下是与cordova相关的一些答案:

检查这些资源以获取有关CORS的更多信息:

还检查浏览器对CORS的支持:

记录formal CORS specification on W3C:)