了解服务器/客户端路由:亚马逊(?)如何在没有重定向(或历史条目)的情况下重定向我的 SPA?

Posted

技术标签:

【中文标题】了解服务器/客户端路由:亚马逊(?)如何在没有重定向(或历史条目)的情况下重定向我的 SPA?【英文标题】:Understanding Server/Client Routing: How Can Amazon(?) Be Redirecting My SPA ... Without a Redirect (or History Entry)? 【发布时间】:2021-01-25 17:03:09 【问题描述】:

注意:我提供的是设置的详细信息,但实际上这是一个“这怎么可能”的问题,而不是“请调试我的设置”的问题。

我有一个“单页应用程序”(即一个使用 History API 来模拟 URL 的 html 文件)。我在 AWS Cloudfront ... 前端后面的 AWS S3 上提供此应用程序。

我已经成功配置了一些东西,所以如果有人访问www.example.com/foo(假设我拥有example.com),Cloudfront 将提供我的index.html 的“错误页面”。然后我的index.html 会看到 URL,并使用它的路由向用户显示正确的页面。

这一切都很好......直到它没有。现在由于某种原因,当我转到www.example.com/foo 时,我被重定向到www.example.com。我正在尝试调试东西,但我不明白我是如何从/foo 转到主页的。

当我查看我的开发人员工具的网络面板时,我可以看到对原始 (/foo) 的请求。然后我可以看到请求链(对于图像、css 文件等),它们都有一个 www.example.com/foo 的引用者。

然后突然间我看到了一个对 React Developer 工具的请求(为什么它需要发出请求超出了我的范围)......它来自推荐人 www.example.com。之后我收到了来自/foo 的最后一个图像请求,然后所有后续请求都来自www.example.com

谁能解释一下这是如何工作的?我知道,如果服务器返回可能会更改我的 URL 的重定向(任何一种类型)......但每个请求都有 200 状态(即没有服务器重定向)。

我知道 javascript 可以“推送”一个新 URL 到我的浏览器……但这会留下一个历史条目,对吗?当我“返回”(使用我的浏览器或history.back())时,我会转到之前的页面;我不会“返回”/foo

所以不知何故,我没有创建历史条目,但我正在切换我的 URL,以及我从中发出请求的 URL,这一切都发生在页面加载的几毫秒内......没有任何重定向。怎么样?

附:当我使用我的开发工具添加一个beforeunload 断点,然后尝试从example.com 导航到example.com/foo打到那个断点(要么去/foo,或者当我被“重定向”回example.com)。

当我选中 any 加载事件的复选框时,我确实看到了一些事情发生……我的 URL 已经切换。换句话说,我输入example.com/foo,按回车键,当任何事件触发时,我又回到example.com。无论机制在这里执行“重定向”...它都不会触发 任何 加载事件。

【问题讨论】:

只是一个疯狂的猜测:你能检查一下你是否部署了应用程序的开发版本吗? 我正在使用带有插件的 Gatsby 来部署到 S3,所以我只能可以部署构建的应用程序.. 我想。我确实看到了对webpack-runtime-3df70ac39eb3b89a09b7.js 的请求,但我很确定这只是 Webpack 生成的构建文件,而不是一些开发工件。 P.S.即使我确实部署了开发版本......我仍然试图了解 如何(即技术机制)开发版本可能会导致我所描述的行为。具体来说,URL 在加载期间发生变化,没有重定向响应,也没有来自客户端重定向的历史条目。 【参考方案1】:

感谢一些 Gatsby 文档,我发现了我的(AWS 特有的)问题。我将在下面提供详细信息以防对其他人有所帮助,但我不会接受这个答案,因为我仍然不明白 AWS 是如何做到的(我仍然欢迎对此的回答)。

发生的事情是我的 Cloudfront“源域名和路径”指向:

example.com.s3.amazonaws.com

但是,正如 https://www.gatsbyjs.com/docs/deploying-to-s3-cloudfront/ 中所述:

您可以通过两种方式将 CloudFront 连接到 S3 源。 AWS 控制台建议的最明显方法是在 Origin Domain Name 字段中键入存储桶名称。这将设置 S3 源,并允许您将 CloudFront 配置为使用 IAM 访问您的存储桶。不幸的是,这也使得无法执行服务器端 (301/302) 重定向,这也意味着目录索引(当有人试图访问目录时提供 index.html)将仅在根目录中有效。您最初可能不会注意到这些问题,因为 Gatsby 的客户端 JavaScript 弥补了后者,而诸如 gatsby-plugin-meta-redirect 之类的插件可以弥补前者。但仅仅因为你看不到这些问题,并不意味着它们不会影响搜索引擎。

为了使您网站的所有功能都能正常工作,您必须改为使用 S3 存储桶的静态网站托管终端节点作为 CloudFront 源。这确实(很遗憾)意味着您的存储桶必须配置为公开读取,因为当 CloudFront 使用 S3 静态网站托管端点地址作为源时,它无法通过 IAM 进行身份验证。

一旦我将 Cloudfront“源域名和路径”更改为存储桶的静态托管 URL

http://example.com.s3-website-us-west-1.amazonaws.com

一切正常!

但是,当我错误地设置“源域名和路径”时,我仍然不明白 AWS 是如何做到的。它将我重定向到我的根域,似乎没有重定向响应或客户端重定向,我很想听听这是如何完成的。

【讨论】:

以上是关于了解服务器/客户端路由:亚马逊(?)如何在没有重定向(或历史条目)的情况下重定向我的 SPA?的主要内容,如果未能解决你的问题,请参考以下文章

哪些原因会导致数据中心断网

Python轻量级Web框架Flask——Flask路由参数/Flask请求与响应/重定项/异常处理

如何在没有 NAT 的情况下连接路由器或防火墙后面的客户端 tcp 端口

laravel 5.1 表示除了 ('/') 之外的所有其他路由,使用 ec2 在在线亚马逊服务器上找不到 404 页面

Angular 1.5.6 和没有 Express 的路由

与客户患难与共