我正在尝试将 AngularJS 设置为与跨域资源通信,其中提供我的模板文件的资产主机位于不同的域中,因此 Angular 执行的 XHR 请求必须是跨域的。我已经为 HTTP 请求添加了适当的 CORS 标头到我的服务器以使其工作,但它似乎不起作用。问题是,当我在浏览器(chrome)中检查 HTTP 请求时,发送到资产文件的请求是一个 OPTIONS 请求(它应该是一个 GET 请求)。
我不确定这是否是 AngularJS 中的错误,或者我是否需要配置一些东西。据我了解,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/ ),其中包含有关需要由服务器发送的确切标头的更多详细信息。