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

Amazon s3 带有Cloudflare的S3托管网站返回任何路由的404状态代码,amazon-s3,cloudflare,Amazon S3,Cloudflare,我有一个S3托管的网站,在Cloudflare背后运行良好,具有以下功能: example.com/工作正常 example.com/test也可以工作,但是网络选项卡中的文档本身自然返回404,因为S3上不存在/test 这是SEO的一个问题,如何配置Cloudflare将404视为200 在Cloudfront中,我通常会这样做: 但我在Cloudflare中找不到相应的配置。这是否必须在Cloudflare worker中完成?在工人存在之前,人们做了什么?我相信你可以从AWS文档中使

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

example.com/
工作正常

example.com/test
也可以工作,但是网络选项卡中的文档本身自然返回404,因为S3上不存在/test

这是SEO的一个问题,如何配置Cloudflare将404视为200

在Cloudfront中,我通常会这样做:


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

我相信你可以从AWS文档中使用这种方法。 示例#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>

404
BUCKETNAME.s3-website-eu-west-1.amazonaws.com

事实证明,在工作人员之前,人们并没有使用Cloudflare在S3上托管,如果他们这样做了,他们也不会在意/注意到他们的路由将返回404

无论如何,这是Cloudflare workers强制返回代码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
}

对于路线“”,您希望实现什么?重定向,或者只是一个200响应。对于该路由,浏览器中应该显示什么?/test将是一个合法的路由,因此我希望在为itThanks提供/index.html时返回200。应该找到/test路由,它使用index.html为我的SPA提供所有请求。您的示例似乎将所有请求完全重定向到/(删除URL路径)然后测试路由返回什么?@Titan如果您描述简单的案例场景,我们两个人可以很快解决这个问题。我相信,我在S3上有一个Vue SPA。S3设置为将所有请求发送到/index.html(包括“错误文档”)。网站的根目录返回应用程序和文档的200代码/测试按预期返回应用程序,但在网络选项卡中,当查看文档的响应代码时,返回的是404。我认为这是因为S3将/test视为丢失的资产,并将错误代码发回,尽管使用index.html正确地提供了错误代码。正如我在上面的屏幕截图中所描述的,这通常在Cloudflare中解决。我需要知道Cloudfront中的等价物。我相信这篇文章会解决你的问题。