我有一个 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 Web 视图中运行时,Origin 会是什么。我决定在我的设备上进行构建和部署,并期望在远程调试(iOS 的 Safari 和 Android 的 Weinre)中看到相同的错误,但令我惊讶的是它有效(不发送任何 CORS 标头)!我还发现,在这两种设备中,应用程序在 file:// 方案下的 webview 中运行,而不是(我假设的)手机操作系统提供的某种 http 服务器。
因此,研究似乎表明 file:// 不需要 CORS - 这样的“站点”可以访问任何域上的任何 XHR 资源。但是,当我在桌面浏览器上测试时,我发现虽然 Safari 不需要 CORS 文件:// 但 Chrome 可以,FireFox 可以在没有 CORS 的情况下以任何方式工作
所以我的问题是:
1) 为什么我的应用程序在 Android/iOS 中无需 CORS 即可运行 - 是因为 CORS 不适用于 file://,还是 Cordova 正在执行某些操作以使其在设备中运行?
I have <access origin="*"/>
在我的配置中
2) 如果在等待问题 1 的答案时,我希望进入安全站点并明确允许来自应用程序的请求,那么您为 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.