小编典典

CORS,Cordova,AngularJs $ http和file:// confusion

angularjs

我有一个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.

阅读 403

收藏
2020-07-04

共1个答案

小编典典

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规范 :)

2020-07-04