S3 托管网站与 Cloudflare returns 404 任何路由的状态代码
S3 hosted website with Cloudflare returns 404 status code for any route
我有一个 S3 托管网站在 Cloudflare 后面运行良好,具有以下功能:
example.com/
工作正常
example.com/test
也有效,但网络选项卡中的文档本身自然会返回 404,因为 /test 在 S3 上不存在。
这是 SEO 的问题,我如何配置 Cloudflare 将 404 视为 200?
在 Cloudfront 中,我通常这样做:
但是我在Cloudflare中找不到对应的配置。这必须在 Cloudflare worker 中完成吗?在 Workers 出现之前人们在做什么?
我相信您可以使用 AWS 文档中的这种方法。
https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html
文档页面底部的示例 #3。
这是用于演示的 S3 存储桶。
EDIT: removed the URL, it served the purpose that was usable only to
author of the question.
这是一个简短的例子。如果找不到,它将重定向到 "home"。
<RoutingRules>
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals >
</Condition>
<Redirect>
<HostName>BUCKETNAME.s3-website-eu-west-1.amazonaws.com</HostName>
<ReplaceKeyWith></ReplaceKeyWith>
</Redirect>
</RoutingRule>
事实证明,人们只是没有在工作人员之前使用 Cloudflare 在 S3 上托管,即使他们这样做了,他们也不会 care/notice 他们的路由会 return 404。
无论如何,这是 Cloudflare 工作人员强制使用 return 代码 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
}
我有一个 S3 托管网站在 Cloudflare 后面运行良好,具有以下功能:
example.com/
工作正常
example.com/test
也有效,但网络选项卡中的文档本身自然会返回 404,因为 /test 在 S3 上不存在。
这是 SEO 的问题,我如何配置 Cloudflare 将 404 视为 200?
在 Cloudfront 中,我通常这样做:
但是我在Cloudflare中找不到对应的配置。这必须在 Cloudflare worker 中完成吗?在 Workers 出现之前人们在做什么?
我相信您可以使用 AWS 文档中的这种方法。 https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html 文档页面底部的示例 #3。
这是用于演示的 S3 存储桶。
EDIT: removed the URL, it served the purpose that was usable only to author of the question.
这是一个简短的例子。如果找不到,它将重定向到 "home"。
<RoutingRules>
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals >
</Condition>
<Redirect>
<HostName>BUCKETNAME.s3-website-eu-west-1.amazonaws.com</HostName>
<ReplaceKeyWith></ReplaceKeyWith>
</Redirect>
</RoutingRule>
事实证明,人们只是没有在工作人员之前使用 Cloudflare 在 S3 上托管,即使他们这样做了,他们也不会 care/notice 他们的路由会 return 404。
无论如何,这是 Cloudflare 工作人员强制使用 return 代码 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
}