AngularJS执行一个交叉的OPTIONS HTTP请求

我试图设置AngularJS与跨源资源进行通信,其中传递我的模板文件的资产主机位于不同的域上,因此角度执行的XHR请求必须是跨域的。 我已经将相应的CORS头添加到了我的服务器上,以使HTTP请求生效,但它似乎不起作用。 问题是,当我检查浏览器中的HTTP请求(chrome)时,发送到资产文件的请求是一个OPTIONS请求(它应该是一个GET请求)。

我不确定这是AngularJS中的一个bug还是我需要配置一些东西。 从我所了解的XHR包装器不能发出OPTIONS HTTP请求,因此它看起来像浏览器试图找出在执行GET请求之前是否“允许”先下载资产。 如果是这种情况,那么我是否需要使用资产主机来设置CORS头(Access-Control-Allow-Origin:http://asset.host ...)?


OPTIONS请求绝不是AngularJS错误,这就是跨源资源共享标准要求浏览器行为的原因。 请参阅此文档:https://developer.mozilla.org/en-US/docs/HTTP_access_control,其中的“概述”部分中提到:

跨源资源共享标准的工作原理是添加新的HTTP标头,允许服务器描述允许使用Web浏览器读取该信息的一组原点。 此外,对于可能对用户数据造成副作用的HTTP请求方法(特别是对于GET以外的HTTP方法或对于某些MIME类型的POST使用)。 该规范要求浏览器“预检”请求,使用HTTP OPTIONS请求头从服务器请求支持的方法,然后在从服务器“批准”时,用实际的HTTP请求方法发送实际请求。 服务器还可以通知客户端“凭证”(包括Cookie和HTTP认证数据)是否应该随请求一起发送。

提供一种适用于所有WWW服务器的通用解决方案非常困难,因为安装程序会因服务器本身和您打算支持的HTTP动词而异。 我会鼓励你找到这篇精彩的文章(http://www.html5rocks.com/en/tutorials/cors/),它有关于需要由服务器发送的确切标题的更多细节。


对于Angular 1.2.0rc1 +,你需要添加一个resourceUrlWhitelist。

1.2:发布版本他们增加了一个escapeForRegexp函数,所以你不再需要转义字符串。 你可以直接添加网址

'http://sub*.assets.example.com/**' 

确保为子文件夹添加**。 这里有一个1.2的工作jsbin:http://jsbin.com/olavok/145/edit


1.2.0rc:如果你仍然在使用rc版本,Angular 1.2.0rc1的解决方案如下所示:

.config(['$sceDelegateProvider', function($sceDelegateProvider) {
     $sceDelegateProvider.resourceUrlWhitelist(['self', /^https?://(cdn.)?yourdomain.com/]);
 }])

这是一个jsbin示例,它适用于1.2.0rc1:http://jsbin.com/olavok/144/edit


Pre 1.2:对于旧版本(参考http://better-inter.net/enabling-cors-in-angular-js/),您需要将以下2行添加到您的配置中:

$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

这是一个jsbin示例,它适用于1.2之前的版本:http://jsbin.com/olavok/11/edit


注意:不确定它是否适用于最新版本的Angular。

原版的:

也可以覆盖OPTIONS请求(仅在Chrome中进行测试):

app.config(['$httpProvider', function ($httpProvider) {
  //Reset headers to avoid OPTIONS request (aka preflight)
  $httpProvider.defaults.headers.common = {};
  $httpProvider.defaults.headers.post = {};
  $httpProvider.defaults.headers.put = {};
  $httpProvider.defaults.headers.patch = {};
}]);
链接地址: http://www.djcxy.com/p/96801.html

上一篇: AngularJS performs an OPTIONS HTTP request for a cross

下一篇: Origin is not allowed by Access