我有一个 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"
一切正常,我Origin:http://dev
在 Chrome 开发工具中看到。
所以,不得不第一次考虑这个问题,我想知道当应用程序在 Android/iOS webviews 中运行时 Origin 会是什么。我决定在我的设备上进行构建和部署,并希望在远程调试中看到相同的错误(iOS 的 Safari 和 Android 的 Weinre),但令我惊讶的是它有效(不发送任何 CORS 标头)!我还发现在这两种设备中,应用程序都在 file:// 方案下的 webview 中运行,而不是(我假设的)手机操作系统提供的某种 http 服务器。
因此,研究似乎表明 file:// 不需要 CORS——这样的“站点”可以访问任何域上的任何 XHR 资源。但是,当我在桌面浏览器上测试时,我发现虽然 Safari 不需要 CORS 文件:// 但是 Chrome 可以,FireFox 可以在没有 CORS 的情况下以任何方式工作
所以我的问题:
1) 为什么我的应用程序在 Android/iOS 中没有 CORS 的情况下工作 - 是因为 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.