amazon-web-services - 使用 AWS Cloudfront 避免 CORS,并清理 SPA url

标签 amazon-web-services cors single-page-application amazon-cloudfront

我有一个位于 S3 中的单页应用程序,由 Cloudfront 提供。还有一个 SPA 通过 AJAX 请求与之对话的后端。我正在尝试两者:

  • 拥有干净的 URL(a la https://keita.blog/2015/11/24/hosting-a-single-page-app-on-s3-with-proper-urls/),通过要求 cloudfront 将 403 和 404 错误重写为生成索引页的 200,以及
  • 通过向代理添加云前端行为来避免 CORS 问题 /api/*到服务器(如 https://stackoverflow.com/a/42883221/1586229 )。

  • 有没有可能实现这两个?问题是,cloudfront 甚至会将来自 api 的 403s 和 404s 更改为 200 index.html回应。

    如果这无法完成,您能否推荐另一种方法来完成我正在尝试做的事情?

    最佳答案

    这种行为可以通过 Lambda@Edge 实现。这是计划:

    创建一个将在 Origin Request 上触发的 Lambda 函数(参见图表了解生命周期中的位置)。一定要在us-east-1中创建,因为这是唯一可以定义 Lambda@Edge 中使用的 Lambda 的区域。

    Cloudfront possible locations for a Lambda@Edge function

    该函数有以下工作:重写对路径的请求,如 /login , /profile , /anything_other_than_assets进入 /index.html .对我来说,我能够制定规则:

    Something is an asset if it has an extension. Otherwise, it's a path



    希望你可以做同样的,或类似的。这是我的函数体的外观(我使用了节点 8)
    const path = require('path')
    
    exports.handler = (evt, ctx, cb) => {
        const {request} = evt.Records[0].cf
    
        if (!path.extname(request.uri)) {
            request.uri = '/index.html'
        }
    
        cb(null, request)
    }
    

    确保您“发布新版本”,然后复制 arn(位于页面顶部)

    where to copy the ARN of your new lambda function

    将其粘贴到 S3 Origin's Behavior 的“Lambda 函数关联”部分。

    Where to paste the ARN of your lambda function

    由于 Lambda@Edge 函数关联的范围限定在 Origin 级别,因此此重定向行为不会影响您的 /api/*行为。

    确保删除自定义错误处理程序。您的 S3 行为不再需要它们,您的 api 行为也不需要它们。

    关于amazon-web-services - 使用 AWS Cloudfront 避免 CORS,并清理 SPA url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52305963/

    相关文章:

    amazon-web-services - DynamoDB 的 UUID?

    amazon-web-services - 在第 431 行第 15 列解析 block 映射时未找到预期的键

    javascript - OPTIONS 405(不允许的方法)无论服务器发送 Access-Control-Allow-Methods :OPTIONS, GET、HEAD、POST

    javascript - 无法从本地文件 :///nor from local web server 获取 XMLHttpRequest 的响应

    node.js - 如何在同一 Node 服务器上提供 React 应用程序和 Api?

    linux - 允许用户使用 key 对通过 SSH 进入 EC2 Linux 实例

    java - RESTful Web 服务在本地主机服务器中运行,但不在生产服务器中运行

    javascript - 监听 Dojo 解析器完成的小部件初始化的结束

    javascript - 错误 : Failed to execute 'send' on 'XMLHttpRequest' : Failed to load 'file' : AngularJS SPA

    linux - 无法让 php mail() 在 linux ubuntu 上工作