Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 s3 Hugo多语言站点部署到aws s3错误“;“拒绝访问”;_Amazon S3_Hugo - Fatal编程技术网

Amazon s3 Hugo多语言站点部署到aws s3错误“;“拒绝访问”;

Amazon s3 Hugo多语言站点部署到aws s3错误“;“拒绝访问”;,amazon-s3,hugo,Amazon S3,Hugo,我在AWS S3上托管一个静态网站,通过AWS Cloudfront提供服务。该网站是建立与雨果在多语言模式。因此,它将从索引页“/”重定向到默认的lang索引页url/en。在这个页面上,我得到错误访问被拒绝。当我手动键入URL/en/index.html时,页面正常加载 我应该如何设置AWS bucket或Hugo以正确显示页面?在本文中找到答案 我需要使用bucket的网站托管端点作为Cloudfront设置中的源域名一种方法是遵循@qwelp共享的链接,解决方案指出,如果使用S3 RES

我在AWS S3上托管一个静态网站,通过AWS Cloudfront提供服务。该网站是建立与雨果在多语言模式。因此,它将从索引页“/”重定向到默认的lang索引页url/en。在这个页面上,我得到错误访问被拒绝。当我手动键入URL/en/index.html时,页面正常加载

我应该如何设置AWS bucket或Hugo以正确显示页面?

在本文中找到答案
我需要使用bucket的网站托管端点作为Cloudfront设置中的源域名

一种方法是遵循@qwelp共享的链接,解决方案指出,如果使用S3 REST API端点而不是静态网站托管,则需要将Cloudfront的源从“S3”更改为“S3”“习俗”起源

解决这个问题的另一种方法是实现一个lambda边缘函数,该函数重定向请求hugo子目录中文件的所有用户请求

使用Lambda@Edge能够通过S3源访问使用CloudFront 标识并为子目录URL上的默认根对象提供服务

来自AWS知识中心

为什么CloudFront不从 子目录?问题Amazon CloudFront为什么不返回我的默认值 子文件夹或子目录中的根对象?默认分辨率 CloudFront的根对象功能仅支持 您的分发指向的源。CloudFront不会返回 子目录中的默认根对象。有关详细信息,请参阅 指定默认根对象

如果CloudFront发行版必须返回默认的根对象 从子文件夹或子目录中,可以集成Lambda@Edge具有 您的发行版。有关配置示例,请参阅实现 Amazon S3支持的Amazon CloudFront中的默认目录索引 起源使用Lambda@Edge.

重要提示:使用时将收取额外费用Lambda@Edge.有关详细信息,请参阅Lambda@Edge定价细节

如中所述 “在本例中,您使用CloudFront edge的计算能力来检查来自客户端的请求。然后重新编写请求,以便CloudFront为以“/”结尾的任何请求URI请求一个默认索引对象(本例中为index.html)

JS中的Lambda边函数:

“严格使用”;
exports.handler=(事件、上下文、回调)=>{
//从发送到的CloudFront事件中提取请求Lambda@Edge 
var request=event.Records[0].cf.request;
//从请求中提取URI
var olduri=request.uri;
//匹配URI末尾出现的任何“/”。将其替换为默认索引
var newuri=olduri.replace(/\/$/,'\/index.html');
//记录CloudFront接收到的URI和用于从源站获取的新URI
log(“旧URI:+olduri”);
log(“新URI:+newuri”);
//将收到的URI替换为包含索引页的URI
request.uri=newuri;
//返回云端
返回回调(null,请求);
};