Cloudfront(带 S3)静态网站不使用子目录中的 index.html

Cloudfront(带 S3)静态网站不使用子目录中的 index.html

我的网站托管在 S3 上,并使用 CloudFront 作为 CDN,我需要这两个 URL 具有相同的行为并提供目录内的 index.html 文件:

example.com/directory example.com/directory/

末尾带有 的那个/错误地提示浏览器下载一个零字节文件,文件名带有随机哈希值。如果没有斜线,它会返回我的 404 页面。

我如何才能让两条路径都传递目录内的 index.html 文件?

如果有办法“应该”做到这一点,那就太好了!这就是我所希望的,但如果没有,我可能会尝试使用 Lambda@Edge 进行重定向。无论如何,在其他一些情况下我都需要这样做,因此有关如何从 Lambda@Edge 进行 301 或 302 重定向的一些说明也会有所帮助 : )

更新(根据 John Hanley 的评论)

curl -i https://www.example.com/directory/

HTTP/2 200 
content-type: application/x-directory
content-length: 0
date: Sat, 12 Jan 2019 22:07:47 GMT
last-modified: Wed, 31 Jan 2018 00:44:16 GMT
etag: "[id]"
accept-ranges: bytes
server: AmazonS3
x-cache: Miss from cloudfront
via: 1.1 [id].cloudfront.net (CloudFront)
x-amz-cf-id: [id]

更新

CloudFront 有一个行为集,将 http 转发到 https 并将请求发送到 S3。我在错误选项卡下还有一个 404 错误路由。

答案1

您是否尝试过不通过 cloudfront 而直接在 S3 上访问目录——行为是否相似?

我实际上确保所有指向子目录的链接都以显式 index.html 结尾,以避免出现此问题。另一种选择是将每个子目录存储到 cloudfront 后面的自己的存储桶中 — index.html 作为默认对象是 S3 设置,我认为它仅适用于存储桶的根目录。

lambda@edge 可以重写请求而不是重定向用户。即每次 GET 请求以 / 结尾时都假装 Index.html。但恐怕不太优雅。

无论如何,对于这些无服务器架构,lambda@edge 似乎是我们传统上放入 Nginx 或 Apache 的 Web 服务器配置的位置。

相关内容