【发布时间】:2020-08-09 03:23:13
【问题描述】:
我想构建一个单页应用程序 (SPA),并在 分离后端 API (REST) 和前端资产(静态 vue.js 代码)时注意到以下问题:
从 API 后端以外的其他域提供 index.html 时,大多数 POST/PUT 请求都会触发 CORS 预检请求。
我做了一些研究,发现博客文章 [1][2] 讨论了这个问题 - 没有给出实际的解决方案。 某些标头(例如 Authorization 标头和具有 application/json 值的 Content-Type 标头)不允许作为 cors-safelisted-request-header。因此 POST/PUT 请求会触发 CORS 预检请求。这是不可接受的,因为它会增加相当多的延迟。
问题
如果两个域都属于同一实体,是否可以避免这些预检请求?
研究
我对如何避免前端和后端之间的 CORS 请求进行了一些研究。该解决方案需要从与 REST API 后端相同的域提供 index.html 文件(请参见下面的示例)。我想知道不使用单独的域是否是避免 SPA 的 CORS 请求的唯一解决方案。
场景(示例)
- 单页应用程序(SPA);前后端层
- 托管在 AWS 云中
- 第 1 层:具有 S3 存储桶源的 CloudFront CDN - 在 static.example.com 上提供静态资产(Vue.js 前端)
- 第 2 层:具有 ECS 集成的负载平衡器,它运行 node.js 容器以在 example.com 上托管 (REST) 后端
- 第 1 层和第 2 层之间的通信使用 HTTPS 协议和 REST 范例。
- index.html 由第 2 层提供服务,客户使用 example.com 打开 web 应用程序。
- index.html 通过指向同一个域 (example.com) 来引用 API。它通过指向 CDN (static.example.com) 来引用静态 vue 资产。
- SPA 由两部分组成:a) 公共资产(.js 文件、.css 文件等)和 b) index.html 文件。后者由同样托管 REST API 的后端容器群提供服务。
参考文献
[1]https://www.freecodecamp.org/news/the-terrible-performance-cost-of-cors-api-on-the-single-page-application-spa-6fcf71e50147/
[2]https://developer.akamai.com/blog/2015/08/17/solving-options-performance-issue-spas
【问题讨论】:
标签: amazon-web-services architecture cors single-page-application