带有Cloudflare的S3托管网站返回任何路线的404状态代码

时间:2019-09-12 20:05:40

标签: amazon-s3 cloudflare

我有一个S3托管网站,在Cloudflare的支持下运行良好,具有以下功能:

ss1

example.com/工作正常

example.com/test也可以工作,但是自然地,由于/ test在S3上不存在,因此网络标签中的文档本身将返回404。

这对于SEO是个问题,如何配置Cloudflare将404s视为200s?

在Cloudfront中,我通常这样做:

ss2

但是我在Cloudflare中找不到相应的配置。这将必须在Cloudflare工作者中完成吗?人们在工人存在之前做了什么?

2 个答案:

答案 0 :(得分:0)

我相信您可以在AWS文档中使用此方法。 https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html 文档页面底部的示例#3。

这是演示的S3存储桶。

  

编辑:删除了URL,它的作用是仅对   问题的作者。

这是一个简短的例子。如果找不到,它将重定向到“家”。

<RoutingRules>
<RoutingRule>
<Condition>
  <HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals >
</Condition>
<Redirect>
  <HostName>BUCKETNAME.s3-website-eu-west-1.amazonaws.com</HostName>
  <ReplaceKeyWith></ReplaceKeyWith>
</Redirect>
</RoutingRule>

答案 1 :(得分:0)

结果发现人们只是没有在工作人员之前使用Cloudflare托管S3,如果他们这样做了,他们不在乎/注意到他们的路线将返回404。

无论如何,这是Cloudflare工作者强制使用200的返回码的解决方案:

addEventListener('fetch', event => {
  event.respondWith(fetchAndApply(event.request))
})

async function fetchAndApply(request) {
  let originalResponse = await fetch(request)

  const contentType = originalResponse.headers.get("Content-Type")

  // Only bother with index pages (not assets)
  if (contentType && contentType.includes("text/html")) {

    // Force 404's from S3 to return as 200 to prevent Google indexing issues
    let response = new Response(originalResponse.body, {
        ...originalResponse,
        status: 200, 
        statusText: 'OK'
      }
    )

    // Don't cache index.html
    response.headers.set('Cache-Control', 'max-age=0')

    return response
  }

  return originalResponse
}