【问题标题】:One domain, two different Vue sites, served from Cloudfront / S3一个域,两个不同的 Vue 站点,由 Cloudfront / S3 提供服务
【发布时间】:2021-03-30 10:39:44
【问题描述】:

我遇到了一个问题,我有两个单独的 Vue 项目正在部署(编译)到两个单独的 S3 存储桶,称为 ContentSiteDashboardSiteContentSite 的内容位于带有 index.html 的存储桶的根目录中。 Dashboard S3 存储桶的所有内容都在 dashboard 子目录中。所以喜欢DashboardSite/dashboard/index.html

我还有一个 Cloudfront 发行版,它具有以下行为:

Default (*) --- ContenSite S3 Bucket

/dashboard/* --- DashboardSite S3 Bucket

当我尝试导航到我刚刚收到key not found 的网站时,问题出在我的 Vue 项目上。

当我浏览 / 时,如何配置我的 Cloudfront 分发以提供来自 ContentSite S3 Bucket 的内容,然后从 dashboard/* 提供来自 DashboardSite S3 Bucket 的内容并且让我的 Vue 路由仍然有效?

【问题讨论】:

    标签: amazon-web-services vue.js amazon-s3 amazon-cloudfront


    【解决方案1】:

    您可以使用 Lambda@Edge 函数来重写 URL。 mplementing Default Directory Indexes in Amazon S3-backed Amazon CloudFront Origins Using Lambda@Edge 是一个很好的参考起点。您可能需要对其进行一些更改以满足您的需求,但想法是相同的。您只需修改传入的请求,以便将其发送到 S3 存储桶中的正确文件。

    这是一个简单的重写示例,它将大部分流量发送到index.html。它适用于 SPA 应用程序。 css 文件、图像、JavaScript 文件等内容按原样传递。您可能还需要调整这些,因为可能需要调整相对路径。

    exports.handler = async (event, context) => {
      const request = event.Records[0].cf.request;
    
      if (new RegExp(/^[^.]+$|\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/).test(request.uri)) {
        request.uri = '/index.html';
      }
    
      return request;
    };
    
    

    【讨论】:

    • 您好,感谢您的回答!我尝试过 Lambda@Edge 但没有成功。你会怎么写呢?
    • 我添加了一个简单的重写规则示例。
    • 嘿,Jason,你会把这个放在 Origin Request 或 Origin Response 上吗?
    • 这将根据原始请求进行。您正在更改从 S3 存储桶请求的内容。
    猜你喜欢
    • 2018-03-20
    • 2014-07-01
    • 2019-06-10
    • 2019-05-05
    • 2019-09-10
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多