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
Redirect 使用Cloudfront将S3子文件夹重定向到另一个域_Redirect_Amazon S3_Amazon Cloudfront_Cname - Fatal编程技术网

Redirect 使用Cloudfront将S3子文件夹重定向到另一个域

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/ 当然,我需要以这种方式处理每一个请求,最终会有这样

我有一个静态showcase网站,托管在S3上,使用CloudFront,还有一个在线商店(Prestashop)和一个博客(Wordpress),都托管在OVH服务器上

我想在我的静态网站的两个子文件夹上进行隐藏重定向,这样就好像我的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

他会回来的

这似乎真的很棘手,因为我还没有找到解决问题的真正办法,在这一点上,我甚至怀疑有可能做这样的事情。 我考虑过使用代理,但这不就像用大锤除掉苍蝇一样吗

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

所以我的问题是“我怎么做?” 但是现在我想知道“一个人能做到吗?”


附:这是我的第一篇帖子,我习惯于在发帖前搜索很长一段时间,最后总是找到解决方案,除了现在。欢迎提出任何建议

我会查一下代理,因为这是我最后的希望

等等

我有一个静态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”

我认为,没有反向代理,您无法完全满足您的需求。但是您可以管理一个记录以转发到正确的服务器,您可以将store.mysite.com和blog.mysite.com转发到ovhserver@FrédéricHenri是的,这正是我想要做的,而且实际上是可行的,但我的利益相关者绝对希望将其放在一个子文件夹中,比如用于SEO目的。谢谢你的回答,我会检查代理,因为这是我最后的希望(多么戏剧性)。好吧,我正在记录我如何做到这一点,谢谢你的启发,事实上,我是在网站部署后开始工作的,所以我没有这样看Cloudfront(我认为它只是一个“网站缓存”)。然而,在我设置了一个源域(myblog.com)和一个行为(/blog/*将所有内容重定向到自定义源myblog.com)之后,我仍然收到一个404错误,它使用我的javascript重定向我。重定向是否可能被错误覆盖?回答我之前的评论:是的!如果您已将Cloudfront发行版的404错误配置为重定向,则任何404错误(无论是远程源还是基本源)都将重定向到您设置的相同链接。我试过在myblog.com/blog中使用index.html文件,但没有。有了它,它可以正确地显示内容,没有它,它会返回到我在基本来源上设置的404页面,因此会覆盖wordpress的404页面。注意!截至2017年7月17日,脚注1中所述的问题有一个本地解决方案Lambda@Edge,wh
// 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);