Redirect 使用Cloudfront将S3子文件夹重定向到另一个域
我有一个静态showcase网站,托管在S3上,使用CloudFront,还有一个在线商店(Prestashop)和一个博客(Wordpress),都托管在OVH服务器上 我想在我的静态网站的两个子文件夹上进行隐藏重定向,这样就好像我的3个网站位于同一主机上一样,使用以下模式:Redirect 使用Cloudfront将S3子文件夹重定向到另一个域,redirect,amazon-s3,amazon-cloudfront,cname,Redirect,Amazon S3,Amazon Cloudfront,Cname,我有一个静态showcase网站,托管在S3上,使用CloudFront,还有一个在线商店(Prestashop)和一个博客(Wordpress),都托管在OVH服务器上 我想在我的静态网站的两个子文件夹上进行隐藏重定向,这样就好像我的3个网站位于同一主机上一样,使用以下模式: mysite.com/-->正常行为 mysite.com/blog/-->myblog.com/ mysite.com/store/-->mystore.com/ 当然,我需要以这种方式处理每一个请求,最终会有这样
- mysite.com/-->正常行为
- mysite.com/blog/-->myblog.com/
- mysite.com/store/-->mystore.com/
附:这是我的第一篇帖子,我习惯于在发帖前搜索很长一段时间,最后总是找到解决方案,除了现在。欢迎提出任何建议 我会查一下代理,因为这是我最后的希望 等等 我有一个静态showcase网站,托管在S3上,使用CloudFront CloudFront是反向代理 根据您对其他两个站点的灵活性,CloudFront可以将多个独立站点合并到一个主机名下,将您带到您想要去的地方 这是通过为您的发行版创建附加的源服务器,然后创建附加的缓存行为来实现的,路径模式与附加路径匹配,例如向备用源发送请求的
/blog
和/blog/*
然而,有一个陷阱。CloudFront无法删除匹配的模式,因此mainsite.example.com/blog/hello-world,匹配模式/blog/*
将转发到blog.example.com/blog/hello-world,而不是blog.example.com/hello-world。这将需要更改其他站点,以便以这种方式集成它们
除非
如果您已经有了唯一的路径模式,没有问题,但是如果额外站点的内容位于每个单独站点的根目录中,您可以在这里看到问题。不可投保,但仍然是一个问题
您唯一的选择是在CloudFront后面使用反向代理来重写这些路径并将请求发送到备用服务器。事实上,这也不是什么大问题,因为HAProxy、Nginx和Varnish都提供了这样的功能,并且可以在非常小的硬件上处理大量代理请求
最近(2017年)发布的服务允许您在处理请求时动态重写路径(如有必要)
但归根结底,除了代理之外,您还没有找到真正的解决方案的原因是没有其他选择--给定主机名上的每个路径都必须在一个逻辑位置处理--一组由一个或多个相同配置的端点组成的组。在CloudFront的情况下,逻辑位置在物理上是全局分布的
在转发请求之前,本机上的CloudFront实际上可以预先发送到路径上,因此在配置源站时,可以通过将源站路径设置为
/foo
将mainsite.example.com/bar/fizz的请求转发到foosite.example.com/foo/bar/fizz。但它不能删除路径部分或修改路径,而不使用Lambda@Edge. 在上面讨论的场景中,在配置其他源服务器时,将源路径保留为空。具有以下行为的单个S3存储桶:
domain.com->从bucket的根目录提供文件服务
domain.com/blog->提供S3 bucket中子文件夹中的文件(这不是默认行为)
如何:
Lambda边缘代码:
"严格使用",;
exports.handler=(事件、上下文、回调)=>{
})
更高代码摘要:
- lambda edge将路径“/blog/”重写为“/blog/index.html”
// 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);