Angular 10 + AWS S3 + Cloudfront:没有哈希的导航

Posted

技术标签:

【中文标题】Angular 10 + AWS S3 + Cloudfront:没有哈希的导航【英文标题】:Angular 10 + AWS S3 + Cloudfront: navigation without a hash 【发布时间】:2021-12-06 21:48:21 【问题描述】:

我在这里看到了很多解决这个问题的问题,但是使用 apache 服务器,对于我的应用程序,我使用 AWS S3 和 Cloudfront,我需要应用程序在 URL 上没有丑陋的哈希值的情况下工作。

有没有什么方法可以在不使用哈希的情况下直接刷新或点击链接?

如果需要代码的任何部分,我可以包含它,但我认为没有必要,因为没有任何问题,我只需要一个可行的策略。

问候。

我的应用路由模块

@NgModule(
  imports: [
    RouterModule.forRoot(routes,  useHash: true )
  ],
  exports: [
    RouterModule
  ]
)

删除哈希 true 可用于导航,但不适用于页面刷新或直接链接

【问题讨论】:

你检查过***.com/questions/54611652/…吗? I need the application to work without the ugly hash 为什么?你想达到什么目标? 嗯,产品管理人员认为哈希不友好,对他们不起作用。我可以忍受它,但我没有悲伤地提出要求。 检查 404 的配置。它应该返回 index.html ***.com/questions/43101013/… 【参考方案1】:

在编写解决方案之前,让我简要说明需要做什么。通常,单页应用程序 (SPA) 中的页面导航是通过 javascript 代码操作视图和/或监视 url 和导航历史事件来实现的。当您启动应用程序并单击不同的链接时,例如/user,应用程序不会重新加载,它仍然是通过根index.html 加载的同一个应用程序,通过更改到相应的视图或组件并修改地址栏中的网址。

但是,如果您在打开浏览器后直接导航到 example.com/user(没有初始加载根 example.com),浏览器将向 /user 路径发送请求,该路径实际上既不存在也不存在于 S3 存储桶中,在云端分发中都没有,尽管它会失败。我们的目标是强制 S3 和 Cloudfront 始终返回根 index.html 文件,而与请求的原始路径无关。

为了实现这一点,您需要稍微更改 S3 存储桶和 Cloudfront 分发的配置。

在进行 AWS 相关更改之前,将 RouterModule 导入的 useHash 属性更改为 false

RouterModule.forRoot(routes,  useHash: false )
    在 AWS Web 控制台中打开您的 S3 存储桶,转到“属性”选项卡,找到“静态网站托管”部分,如果它被禁用,则启用它并将index.html 放入两个字段:索引文档错误文档

然后保存配置。实际上,现在您的 index.html 文件将为与根路径相同的任何路径提供服务。您应该已经注意到,当您在应用上述更改后打开您的网站时。但是,您会注意到响应代码是 404,尽管应用程序正确打开 - 这是因为它仍然是“未找到”响应,因为路径不存在。云端配置也需要进行一些更改,以使其工作得更好。

    在 aws Web 控制台中导航到云端分发页面。我假设由于您已经拥有云端分发(您在问题中提到过),那么您可能已经拥有所有默认设置,并且您的 S3 存储桶已作为此分发的来源连接。导航到“错误页面”选项卡,然后按“创建新的自定义错误响应”。在“自定义”输入中点击“是”,选择错误代码404,在“响应页面路径”输入中写入“/index.html”并选择响应代码200OK。然后保存配置。开始工作可能需要几分钟时间。

现在尝试打开网站 - 您应该不会再看到 404 响应,因为现在所有请求(甚至不存在的路径)都有代码 200。

【讨论】:

感谢您的精彩解释,我一步一步完成了您的步骤,现在我的网址可以在没有哈希的情况下使用。【参考方案2】:

移除哈希策略,

RouterModule.forRoot(routes, 
  useHash: false
);

转到您存储桶的静态网站托管设置并将错误文档设置为 index.html。

基本上,我们只想在所有情况下都提供 index.html,因为这是在所有情况下都必须提供的文件,因为 Angular 构建没有像静态网站这样的路由的文件夹结构。

现在您的路线将如下所示:

localhost:4200/home

代替:

localhost:4200/#/home

来自 AWS 的参考:https://docs.aws.amazon.com/AmazonS3/latest/userguide/CustomErrorDocSupport.html#custom-error-document

【讨论】:

以上是关于Angular 10 + AWS S3 + Cloudfront:没有哈希的导航的主要内容,如果未能解决你的问题,请参考以下文章

Angular 11 路由在 AWS S3 和 Cloudfront 中不起作用

如何让 AWS S3 存储桶中的 Angular 应用程序对 AWS Elastic Beanstalk 中的服务进行 API 调用

AWS S3 Angular 应用程序通过 Route 53 地址调用 ECS 任务

如何使用angular js将aws s3文件复制到同一个存储桶中的特定文件夹

在AWS s3中保存图像

通过 ACM 和负载均衡器为 aws Nodejs 弹性 beanstalk 设置了 HTTPS,我如何在 s3 存储桶中为 Angular 设置 HTTPS