使用Cloudfront

时间:2016-08-01 10:24:51

标签: redirect amazon-s3 amazon-cloudfront cname

我在S3上使用CloudFront托管的静态展示网站,以及在OVH服务器上托管的在线商店(Prestashop)和博客(Wordpress)。

我想在我的静态网站的两个子文件夹上进行隐藏重定向,因此它就像我的3个网站在同一主机上一样,使用以下模式:

  • mysite.com/ - >正常行为
  • mysite.com/blog/ - > myblog.com /
  • mysite.com/store/ - > mystore.com /

当然,我需要以这种方式处理每一个请求,最终得到类似的东西:

mysite.com/store /fr/1-myproduct.html

返回

mystore.com /fr/1-myproduct.html

会回来的。

这看起来非常棘手,因为我发现我的问题没有真正的解决方案,而且在这一点上我怀疑甚至可能做这样的事情。 我考虑使用代理但不会像使用大锤去除苍蝇那样?

我搜索了任何可能的重定向,我只能找到子域/域重定向...

所以我的问题是"我该怎么做?" 但是现在我想知道"可以做到吗?"

P.S:这是我的第一篇文章,我过去常常在发布之前搜索了很长时间,除了现在,我总是找到解决方案。欢迎提出任何建议。

2 个答案:

答案 0 :(得分:5)

  

我将检查代理,因为这是我的最后希望

等待。

  

我在S3上托管了一个静态展示网站并使用CloudFront

CloudFront是反向代理

根据您与其他两个网站的灵活性,CloudFront可能会将您带到您想去的位置,将多个独立网站合并到一个主机名下。

这是通过为您的发行版创建其他原始服务器,然后创建其他缓存行为来完成的,其中路径模式与附加路径匹配,例如/blog/blog/*将请求发送到备用来源。

然而,有一个问题。 CloudFront无法删除匹配的模式,因此匹配模式/blog/*的mainsite.example.com/blog/hello-world将转发到blog.example.com/blog/hello-world - 而不是博客.example.com / hello-world.¹这将需要更改其他网站,以便以这种方式集成它们。

除非......

如果您已经拥有唯一的路径模式,没问题,但如果额外网站的内容位于每个网站的根目录中,您会在此处看到问题。不是不可怀疑的,但仍然是一个问题。

您唯一的选择是支持 CloudFront后面的反向代理,以重写这些路径并将请求发送到备用服务器。真的不是什么大问题,因为HAProxy,Nginx和Varnish都提供这样的功能,并且能够在令人惊讶的小硬件上处理大量代理请求。

最近(2017年)发布的Lambda@Edge服务允许您在处理请求时动态重写路径,如有必要。

但最重要的是,你没有找到除代理之外的真正解决方案的原因是没有其他选择 - 给定主机名的每个路径必须在一个逻辑位置处理 - 一组一个或更相同配置的端点。对于CloudFront,逻辑位置是全局分布的。

¹CloudFront本身实际上可以在转发请求之前预先添加到路径上,因此通过设置原点,可以将对mainsite.example.com/bar/fizz的请求转发到foosite.example.com/foo/bar/fizz配置原点时/foo的路径。但它不能删除路径部分或以其他方式修改路径而不使用Lambda @ Edge。在上面讨论的场景中,在配置其他源服务器时,您将原始路径留空。

答案 1 :(得分:0)

单个S3存储桶具有以下行为:

domain.com->从存储桶的根目录提供文件

domain.com/blog->从S3存储桶中的子文件夹提供文件(这不是默认行为)

方法:

https://aws.amazon.com/ru/blogs/compute/implementing-default-directory-indexes-in-amazon-s3-backed-amazon-cloudfront-origins-using-lambdaedge/

Lambda边缘代码:

“严格使用”; exports.handler =(事件,上下文,回调)=> {

// Extract the request from the CloudFront event that is sent to Lambda@Edge 
var request = event.Records[0].cf.request;

// Extract the URI from the request
var olduri = request.uri;

// Match any '/' that occurs at the end of a URI. Replace it with a default index
var newuri = olduri.replace(/\/$/, '\/index.html');

// Log the URI as received by CloudFront and the new URI to be used to fetch from origin
console.log("Old URI: " + olduri);
console.log("New URI: " + newuri);

// Replace the received URI with the URI that includes the index page
request.uri = newuri;

// Return to CloudFront
return callback(null, request);

};

更高的代码摘要:

  • lambda edge将路径“ / blog /”重写为“ /blog/index.html”