AngularJS针对跨域资源执行OPTIONS HTTP请求。

20 浏览
0 Comments

AngularJS针对跨域资源执行OPTIONS HTTP请求。

我正在尝试配置AngularJS与跨域资源通信,其中提供模板文件的资源主机位于不同的域中,因此Angular执行的XHR请求必须跨域。我已向我的服务器添加了适当的CORS头以使HTTP请求正常工作,但似乎并不起作用。问题在于当我在浏览器(chrome)中检查HTTP请求时,发送到资源文件的请求是OPTIONS请求(应该是GET请求)。

我不确定这是否是AngularJS中的一个bug,还是需要进行某种配置。据我所知,XHR包装器无法生成OPTIONS HTTP请求,因此浏览器似乎尝试在执行GET请求之前先确定是否“允许”下载资源。如果是这样,那么我是否需要为资源主机设置CORS头(访问控制允许来源:http://asset.host...)?

admin 更改状态以发布 2023年5月23日
0
0 Comments

对于Angular 1.2.0rc1+你需要添加一个资源URL白名单。

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

'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

0
0 Comments

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/,其中包含更多有关服务器需发送的确切标头的详细信息。

0