我有一个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.
答案 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的支持: