从文件//scheme运行的应用程序出现CORS错误
CORS error for application running from file:// scheme
我有一个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
。
所以,第一次考虑这个问题时,我想知道当应用程序在安卓/iOS网络视图中运行时,Origin会是什么。我决定在我的设备上进行构建和部署,并希望在远程调试中看到同样的错误(iOS版Safari和Android版Weinre),但令我惊讶的是,它能工作(不发送任何CORS头)!我还发现,在这两种设备中,应用程序都在文件://方案下的网络视图中运行,而不是(我假设的)手机操作系统提供的某种http服务器。
因此,研究似乎表明,文件不需要CORS://-这样的"网站"可以访问任何域上的任何XHR资源。但是,当我在桌面浏览器上测试这一点时,我发现Safari不需要文件CORS:///,但Chrome需要,FireFox在没有CORS 的情况下也可以
所以我的问题是:
1) 为什么我的应用程序在Android/iOS中没有CORS也能工作?是因为CORS不适用于文件://,还是Cordova在做什么让它在设备中工作?
我的配置中有<access origin="*"/>
2) 如果在等待对Q1的回答时,我应该在安全的网站上并明确允许来自应用程序的请求,那么您给文件//"hosts"的访问控制允许来源的值是多少?在我的调试中,来自文件的请求中没有Origin标头://
3) 除了阻止对远程服务器的XHR请求外,Chrome还阻止了我的应用程序模板(我使用的是单独的文件),请参阅下文。这是我的应用程序的潜在问题,还是只是我不需要担心的Chrome问题?
XMLHttpRequest cannot load file:///Volumes/projects/phonegap/www/templates/tabs.html. Cross origin requests are only supported for HTTP.
CORS头有两种方式来表示应该允许跨域XHR:
- 发送
Access-Control-Allow-Origin: *
(允许所有主机) - 通过后端将要允许的主机放入
Origin
标头
对于file://
URL,它们将生成一个nullOrigin
,该值无法通过第二个选项(回显)进行授权。
如前所述:
跨域策略不适用于PhoneGap(由于各种原因,主要是因为您的应用程序基本上是在设备上运行文件://URI)。
请注意,您必须为应用程序设置白名单才能访问这些外部域。
至于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项目的问题跟踪器#40787的讨论。他们将这些问题标记为不会修复,因为这种行为是按设计发生的。
有一种解决方案可以简单地关闭Chrome中的CORS进行开发,从--allow-file-access-from-files --disable-web-security
启动Chrome
例如,对于Windows
`C:'Users'YOUR_USER'AppData'Local'Google'Chrome'Application'chrome.exe --allow-file-access-from-files --disable-web-security`
以下是更多与科多瓦相关的答案:
- CORS和phonegap应用程序
- Apache Cordova中的域白名单-一种控制外部域访问的安全模型
查看这些资源了解更多关于CORS的信息:
- 跨来源资源共享和文件://
- 一个不错的CORS教程:http://www.html5rocks.com/en/tutorials/cors/
- 围绕原产地政策开展工作
- HTTP访问控制(CORS)(Mozilla)
另请查看浏览器对CORS:的支持
- http://caniuse.com/#feat=cors
为了记录W3C上正式的CORS规范:)
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- AngularJS应用程序中的CORS错误
- 在不同端口上运行时,rest api应用程序服务器(express)和Angulars js应用程序之间的Cors问题
- 访问 WebGL 的 Soundcloud 波形/插图 (三.js) 应用程序 - CORS 问题
- 当 rest api 应用程序服务器(express)和 Angulars js 应用程序在不同的端口上运行时,Cors
- 在phonegap应用程序的node.js服务器上使用CORS
- 从文件//scheme运行的应用程序出现CORS错误
- CORS标头在MEAN堆栈应用程序中不工作
- 由于CORS错误,无法跨域ajax发布到Heroku上的Rails应用程序
- 可扩展应用程序的CORS问题
- 你好,我需要知道如何在OpenShift的RAILS REST应用程序中启用CORS
- 如何在Phonegap应用程序中使用canvas来启用CORS
- CORS问题在顶点应用程序不工作
- 无法绕过angularjs种子应用程序中的CORS
- 使用.getJSON获取Play Store应用程序详细信息时,获取跨来源块请求[CORS]错误
- Netbeans 8.0.2 中 Cordova 应用程序的 CORS 问题