我有一个AngularJS / Cordova应用程序,该应用程序轮询远程服务器上的JSON服务:
$http({method: 'GET', url: 'http://example.com/index.php'})
在浏览器中进行开发并在我的IntranetApache服务器(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标头)!我还发现,在这两种设备中,该应用程序都在webview中以file://方案运行,而不是(我假设)电话操作系统提供的某种HTTP服务器。
因此研究似乎表明file://不需要CORS-
这样的“站点”可以访问任何域上的任何XHR资源。但是,当我在台式机浏览器上进行测试时,我发现Safari并不需要CORS作为文件://,但Chrome可以,并且FireFox可以在没有CORS的情况下正常工作
所以我的问题是:
1)为什么我的应用程序在Android / iOS中没有CORS的情况下仍能正常工作-
是因为CORS不适用于file://,还是Cordova正在做一些事情使其在设备中运行?
我<access origin="*"/>
在配置中
2)如果在等待问题Q1的答案之前,我想呆在安全的站点上并明确允许应用程序发出请求,那么您给file://“主机”赋予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.
CORS标头有两种方式来表示应允许跨域XHR:
Access-Control-Allow-Origin: *
(允许所有主机)Origin
后端的标头中至于file://
URL,它们将产生一个不能通过第二个选项( echo-back )授权的 空值 。Origin
__
至于提到的:
跨域策略不适用于PhoneGap(出于各种原因,基本上是因为您的应用实质上是在设备上的file:// 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
例如,对于Windows
`C:\Users\YOUR_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files --disable-web-security`
这是与Cordova相关的更多答案:
检查这些资源以获取有关CORS的更多信息:
另请检查浏览器对CORS的支持:
并记录在W3C上的正式CORS规范 :)
问题内容: 因为在AngularJS中使用CORS和http身份验证可能会比较棘手,所以我编辑了问题以分享一个经验教训。首先,我要感谢igorzg。他的回答对我很有帮助。场景如下:您想使用AngularJS $ http服务将POST请求发送到另一个域。获取AngularJS和服务器设置时,需要注意一些棘手的事情。 第一:在您的应用程序配置中,您必须允许跨域调用 第二:您必须指定withCrede
问题内容: 我的问题很简单,但我找不到答案,也没有自己进行测试的资源。我可以从一个域向另一个HTTPS域发出HTTPS CORS请求吗?我可以从一个域向另一个HTTPS域发出HTTP CORS请求吗?我知道,我可以执行从一个域到另一个HTTP域的HTTP CORS请求,但是当使用HTTPS时,我不知道是否存在任何区别。 谢谢, 菲利普 问题答案: 是的,您可以从一个HTTPS域向另一个HTTPS域
问题内容: 我有一些要调用的Web服务。或,我应该使用哪一个? :https : //docs.angularjs.org/api/ngResource/service/$resource :https : //docs.angularjs.org/api/ng/service/$http 阅读以上两个API页面后,我迷路了。 您能用简单的英语给我解释一下有什么区别,在什么情况下我应该使用它们?如
问题内容: 我在AngularJS的$ http上遇到了一个奇怪的行为,但并没有真正理解transformResponse的工作方式(文档对此有点儿淡淡)。 api返回一个对象数组: 但是,当transformResponse完成操作后,数据就变成了索引对象: 我想保留原始数据结构(对象数组)。 问题答案: 为了使角度不将数据转换为对象,您需要覆盖默认$ httpProvider.defaults
问题内容: 由于某种原因,每当我尝试将一些数据发布到api服务器时,都会出现以下两个错误。 这是我的客户端有角JS代码,试图发送一些简单数据。该代码当前正在位于以下位置的Nginx服务器上运行 这是我的节点JS代码,用于处理“处理”请求 问题答案: 如错误消息所述,您必须在对预检的响应中确认Content-Type标头。这可能是由于您的请求的非“简单” Content- Type(表面上是appl
HTTP File Server(HFS)是一个基于HTTP协议的文件服务器。