【发布时间】:2014-11-12 21:02:50
【问题描述】:
我有一个 AngularJS/Cordova 应用程序,它轮询远程服务器上的 JSON 服务:
$http({method: 'GET', url: 'http://example.com/index.php'})
在浏览器中开发并运行我的 Intranet apache 服务器 (http://dev) 我得到“不存在 'Access-Control-Allow-Origin' 标头”,所以我通过添加来解决这个问题:
Header set Access-Control-Allow-Origin "http://dev"
一切正常,我在 Chrome 开发工具中看到了Origin:http://dev。
所以,不得不第一次考虑这个问题,我想知道当应用程序在 Android/iOS webviews 中运行时 Origin 会是什么。我决定在我的设备上进行构建和部署,并希望在远程调试(iOS 的 Safari 和 Android 的 Weinre)中看到相同的错误,但令我惊讶的是它可以工作(不发送任何 CORS 标头)!我还发现,在这两种设备中,应用程序都在 file:// 方案下的 web 视图中运行,而不是(我假设的)手机操作系统提供的某种 http 服务器。
因此研究似乎表明文件:// 不需要 CORS - 这样的“站点”可以访问任何域上的任何 XHR 资源。但是,当我在桌面浏览器上测试它时,我发现虽然 Safari 不需要文件:// 的 CORS,但 Chrome 可以,而 FireFox 可以在没有 CORS 的情况下以任何方式工作
所以我的问题:
1) 为什么我的应用在没有 CORS 的情况下在 Android/iOS 中运行 - 是因为 CORS 不适用于 file://,还是 Cordova 是否正在采取措施使其在设备中运行?
我的配置中有<access origin="*"/>
2) 如果在 Q1 的未决答案中,我应该在安全站点上并明确允许来自应用程序的请求,那么您为 file://“hosts”赋予 Access-Control-Allow-Origin 什么值?在我的调试中,来自 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.
【问题讨论】:
标签: javascript ajax angularjs cordova cors