Access-Control-Allow-Origin在第一个响应中丢失

我正在使用通过CloudFront CDN的Web应用程序(Angular + Rails)来pipe理服务器资产。 应用程序通过nginx被正确设置为“Access-Control-Allow-Origin”标题。 CloudFront已设置为转发标题。

问题是头文件在Angular模板的第一个响应中丢失了,但是在随后的响应(如果我刷新页面)上正确地出现了。

例如,如果我清除了Chrome中的所有历史logging和caching并访问该页面,则模板文件的响应将不具有“Access-Control-Allow-Origin”标题。 如果我刷新页面,模板的响应将具有标题。

我注意到,如果我清除所有的历史logging和caching,但不是cookie,它会继续正常工作。

它在Firefox上的performance类似。 如果我清除所有的历史logging并caching,它在第一个响应中不起作用,但是在随后的响应中它可以正常工作。 清除所有历史logging和caching但没有Cookie后,它将继续正常工作,与Chrome不同。

另外,如果我在Firefox中打开开发工具并禁用caching,则在每个响应中缺less标题。

你知道这个问题可能是什么,或者我应该在哪里看下一个?

谢谢。

“Access-Control-Allow-Origin”是一个响应头,而不是一个请求头。 当HTTP客户端使用OPTION方法发送请求时,它由HTTP服务器返回。 例如,当目标URL不是当前页面URL(请参阅跨源资源共享问题)时,浏览器中的ajax API会在尝试POST请求之前发送OPTION请求。 这个OPTION请求包含保存URL(scheme + domain)当前页面开头的“Origin”标题。 Ajax API只有在响应中包含标题为“Access-Control-Allow-Origin”的页面时,才会发送POST请求。

如果您想要访问另一台服务器上的动态内容,而不是服务当前页面的动态内容,则只需要担心这些标题。 这似乎不是你的情况。

有关CORS的更多信息,请参阅此维基百科页面: https : //en.wikipedia.org/wiki/Cross-origin_resource_sharing

如果还有AngularJS标签,让我建议你不要加载html模板,而是将它们全部编译成一个JS文件(例如使用html2js grunt插件)