我有一个CloudFront发行版,它指向一个保存我的网站静态内容的S3存储桶。这是使用S3 REST API端点完成的,因此原始域名和路径如下所示:
bucket-name.s3.amazonaws.com
到目前为止,这是可行的,我知道这是因为当我打开浏览器并输入https://xxxxxxxxxxxxx.cloudfront.net/index.html
时,它将下载html文件。但这还不是我想要的。我的网站是用React编写的SPA(单页应用程序)。这意味着并非客户端代码中提到的所有资源实际上都可以在存储桶中找到。存储桶中物理上不可用的那些资源是虚拟资源,应该由客户端代码处理。
为此,如果用户在浏览器中输入虚拟URL的地址,则服务器首先需要验证该资源是否存在。如果没有,则服务器应返回index.html
文件而不是404错误。可以在CloudFront的错误页面中进行设置。
因此,我为CloudFront发行版创建了一个Custome错误响应,以处理所有404错误,返回状态为200正常的index.html
文件。但这不起作用。
输入网址https://xxxxxxxxxxxxx.cloudfront.net/virtual-url
时,它将返回:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>39E3967AA5F16693</RequestId>
<HostId>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</HostId>
</Error>
甚至裸URL https://xxxxxxxxxxxxx.cloudfront.net
也会返回完全相同的错误。
所以我的问题是,当发行版使用S3 REST API端点时如何使用CloudFront的错误页面?
P.S。当我使用S3的静态网站终结点(bucket-name.s3-website.us-east-1.amazonaws.com
)时,相同的机制起作用。