Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 了解服务器/客户端路由:Amazon(?)如何重定向我的SPA。。。没有重定向(或历史记录条目)?_Amazon Web Services_Redirect_React Router_Single Page Application_Amazon Cloudfront - Fatal编程技术网

Amazon web services 了解服务器/客户端路由:Amazon(?)如何重定向我的SPA。。。没有重定向(或历史记录条目)?

Amazon web services 了解服务器/客户端路由:Amazon(?)如何重定向我的SPA。。。没有重定向(或历史记录条目)?,amazon-web-services,redirect,react-router,single-page-application,amazon-cloudfront,Amazon Web Services,Redirect,React Router,Single Page Application,Amazon Cloudfront,注意:我提供了我的设置细节,但实际上这是一个“这怎么可能”的问题,而不是“请调试我的设置”的问题 我有一个“单页应用程序”(即使用历史API模拟URL的HTML文件)。我在AWS S3上提供此应用程序,在AWS Cloudfront后面。。。前面 我已经成功地配置了一些东西,因此如果有人转到www.example.com/foo(让我们假设我拥有example.com),Cloudfront将为我的index.html提供一个“错误页面”。然后,我的index.html将看到URL,并使用其路由

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

我有一个“单页应用程序”(即使用历史API模拟URL的HTML文件)。我在AWS S3上提供此应用程序,在AWS Cloudfront后面。。。前面

我已经成功地配置了一些东西,因此如果有人转到
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开发者工具的请求(我无法理解为什么它需要发出请求)。。。它来自referer
www.example.com
。之后,我从
/foo
收到最后一个图像请求,然后所有后续请求都来自
www.example.com

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

我知道Javascript可以“推”一个新的URL到我的浏览器。。。但那会留下一个历史记录,对吗?当我“返回”(使用浏览器或
history.back()
)时,我会转到前面的页面;我不会“返回”到
/foo

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

另外,当我使用我的开发工具在卸载之前添加一个
断点,然后尝试从
example.com
导航到
example.com/foo
时,我没有达到那个断点(无论是去
/foo
,还是我被“重定向”回
example.com

当我选中任何加载事件的复选框时,我确实看到一些事件发生。。。在我的URL已经切换之后。换句话说,我键入
example.com/foo
,点击回车键,当任何事件触发时,我回到
example.com
。无论是什么机制在这里做“重定向”。。。它不会触发任何加载事件。

多亏了一些盖茨比文档,我解决了(AWS特有的)问题。我将在下面列出细节,以防它对其他人有所帮助,但我不会接受这个答案,因为我仍然不明白AWS是如何做到这一点的(我仍然希望得到答案)

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

example.com.s3.amazonaws.com
然而,正如上所述:

有两种方法可以将CloudFront连接到S3源站。AWS控制台将建议的最明显的方法是在“源域名”字段中键入bucket名称。这将设置一个S3源,并允许您配置CloudFront以使用IAM访问您的存储桶。不幸的是,这也使得无法执行服务器端(301/302)重定向,而且这也意味着目录索引(当有人试图访问目录时提供index.html)将只在根目录中工作。您最初可能不会注意到这些问题,因为Gatsby的客户端JavaScript补偿了后者,而Gatsby插件元重定向等插件可以补偿前者。但仅仅因为你看不到这些问题,并不意味着它们不会影响搜索引擎

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

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

一切都成功了


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

只是一个猜测:你能检查一下你是否部署了该应用的开发版本吗?我正在使用Gatsby和一个插件部署到S3,所以我只能部署一个内置应用。。我想。我确实看到了对
webpack-runtime-3df70ac39eb3b89a09b7.js
的请求,但我很确定这只是webpack生成的构建文件,而不是一些开发工件。即使我部署了一个开发版本。。。我仍在试图理解开发版本是如何导致我所描述的行为的(即技术机制)。具体地说,URL在加载过程中发生更改,没有重定向响应,也没有来自客户端重定向的历史记录条目。
http://example.com.s3-website-us-west-1.amazonaws.com