Amazon s3 如何从S3子目录服务AWS EC2实例

Amazon s3 如何从S3子目录服务AWS EC2实例,amazon-s3,amazon-ec2,amazon-cloudfront,Amazon S3,Amazon Ec2,Amazon Cloudfront,我有一个网站托管在AWS S3上,通过Cloudfront提供服务。www.mysite.com 我在一个EC2实例上主持一个博客 我想从www.mysite.com/blog获得此博客 出于SEO目的,我不希望它是www.blog.mysite.com 只有S3和Couldfront可以实现这一点吗 我已经玩过S3重定向和Lambda@edge但是关于这些的文档并不多。就Lambda@edge如果可以的话,我想避免进一步的复杂性。S3重定向工作,但用户不再在mysite域下 S3重定向示例 &

我有一个网站托管在AWS S3上,通过Cloudfront提供服务。www.mysite.com

我在一个EC2实例上主持一个博客

我想从www.mysite.com/blog获得此博客

出于SEO目的,我不希望它是www.blog.mysite.com

只有S3和Couldfront可以实现这一点吗

我已经玩过S3重定向和Lambda@edge但是关于这些的文档并不多。就Lambda@edge如果可以的话,我想避免进一步的复杂性。S3重定向工作,但用户不再在mysite域下

S3重定向示例

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>blog/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <HostName>${EC2_Public_DNS}</HostName>
    </Redirect>
  </RoutingRule>
</RoutingRules>


我读过的其他文章涉及使用apache或nginx服务器处理重定向。我宁愿不必添加其中一个。

因为重定向是针对浏览器的指令,告诉它在其他地方查找请求的资源,-它将重定向返回到浏览器

相反,您需要的是一个新的CloudFront缓存行为和一个新的CloudFront源服务器声明,在处理您的站点的现有CloudFront发行版中配置

在CloudFront中,添加一个新的原点,将原点域名设置为指向EC2实例的主机名或实例前面的负载平衡器(如果有)。您会注意到一个名为originpath的字段,您可能想将其设置为/blog/或类似的值,但这是不正确的。将原点路径留空

然后添加与路径模式/blog/*匹配的新缓存行为,并将其指向新的原点

简而言之,这就是您要寻找的,但是还有一些其他因素需要适当的设置和配置

您需要在源服务器上使用TLS证书,除非您将源协议策略设置为仅HTTP,在这种情况下,您正在CloudFront和EC2之间运行未加密的流量。CloudFront已经为在您的源服务器上正确配置TLS做好了准备,大多数与TLS相关的错误配置都会导致错误代码,当然,该错误代码可能还有其他原因

您的博客软件可能需要查询字符串参数和/或cookie,默认情况下,CloudFront会从所有请求中删除这些参数和cookie,因为它们会干扰缓存。这是两种通常需要自定义的设置,因为默认设置基于典型静态内容的适当设置

您还需要配置日志软件,以期望传入的请求包含路径前缀/blog/,因为CloudFront不会删除路径组件。使用从原始服务器剥离的一个或多个元素来显示原始服务器的路径的唯一方法是使用Lambda@Edge要重写路径-

如果您现在在心里抗议将路径设置为/blog/而不是/blog,那么需要记住的问题是,此路径需要正确的锚定-HTTP语义假定目录级别以/结尾,而文件和其他资源则不以/结尾,因此,如果你试图将博客放在一条不以/…结尾的路径上,你可能会遇到困难。。。但是为了不希望用户键入trailing/,您仍然需要在S3中配置重定向,但这只是为了将对/blog的请求发送回/blog/


在测试时,您可能还希望设置,这样您就不会修复问题,并在接下来的5分钟内继续看到返回的缓存错误,即使您所做的更改已经解决了该错误。CloudFront这样做是为了帮助避免源服务器过载,因为它可能已经遇到问题,这一点可以从它返回错误的事实中得到证明,但它会让一些用户措手不及。

为什么不使用负载平衡器呢?
<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyEquals>blog</KeyEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyWith>blog/</ReplaceKeyWith>
      <HostName>${main_site_hostname}</HostName>
      <Protocol>https</Protocol>
    </Redirect>
  </RoutingRule>
</RoutingRules>