我在S3上使用CloudFront托管的静态展示网站,以及在OVH服务器上托管的在线商店(Prestashop)和博客(Wordpress)。
我想在我的静态网站的两个子文件夹上进行隐藏重定向,因此它就像我的3个网站在同一主机上一样,使用以下模式:
当然,我需要以这种方式处理每一个请求,最终得到类似的东西:
mysite.com/store /fr/1-myproduct.html
返回
mystore.com /fr/1-myproduct.html
会回来的。
这看起来非常棘手,因为我发现我的问题没有真正的解决方案,而且在这一点上我怀疑甚至可能做这样的事情。 我考虑使用代理但不会像使用大锤去除苍蝇那样?
我搜索了任何可能的重定向,我只能找到子域/域重定向...
所以我的问题是"我该怎么做?" 但是现在我想知道"可以做到吗?"
P.S:这是我的第一篇文章,我过去常常在发布之前搜索了很长时间,除了现在,我总是找到解决方案。欢迎提出任何建议。答案 0 :(得分:5)
我将检查代理,因为这是我的最后希望
等待。
我在S3上托管了一个静态展示网站并使用CloudFront
CloudFront是反向代理。
根据您与其他两个网站的灵活性,CloudFront可能会将您带到您想去的位置,将多个独立网站合并到一个主机名下。
这是通过为您的发行版创建其他原始服务器,然后创建其他缓存行为来完成的,其中路径模式与附加路径匹配,例如/blog
和/blog/*
将请求发送到备用来源。
/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存储桶中的子文件夹提供文件(这不是默认行为)
方法:
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);
};
更高的代码摘要: