当 url 没有斜杠时,AWS s3 强制 302 重定向 - 需要 301s

Posted

技术标签:

【中文标题】当 url 没有斜杠时,AWS s3 强制 302 重定向 - 需要 301s【英文标题】:AWS s3 forces 302 redirects when url has no trailing slash - need 301s 【发布时间】:2015-07-17 09:18:23 【问题描述】:

我正在将 Wordpress 网站迁移到托管在 Amazon s3 存储桶中的静态网站。所有页面都在一个目录结构中(例如 blog/index.html),但可以通过 /blog/ 访问。

默认情况下,亚马逊通过 302 重定向 (www.site.com/page -- 302 --> www.site.com/page/) 重定向缺少尾部斜杠的 URL。这对 SEO 来说太糟糕了,我正在尝试将这些重定向设为 301。

我尝试在根目录中添加 page.html 对象,并按照亚马逊的说明设置重定向到 /page/。这只会为 /page.html 创建 301。 /page 仍然会导致 302。

亚马逊的重定向说明: http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html

关于问题的相关博文: http://moz.com/community/q/new-static-site-with-302s

有没有人遇到过这种情况,或者有什么想法我能做什么?

【问题讨论】:

【参考方案1】:

您现在可以使用 CloudFront 和 Lambda@Edge 解决此问题。您可以使用 'origin response' 事件拦截从 S3 返回的请求,然后将响应状态码更改为 301。

以下是您需要添加到 Lambda 处理程序的代码。

exports.handler = async (event) => 
    const response = event.Records[0].cf.response;
    if (response.status === '302') 
        response.status = '301';
        response.statusDescription = 'Moved Permanently'
    
    return response;
;

这是一篇博文,我写的,详细解释了如何做到这一点

https://www.vividbytes.io/fixing-redirect-codes-on-static-s3-websites/

【讨论】:

【参考方案2】:

根据docs,返回302确实是他们的设计:

...如果您从前面的 URL 中排除尾部斜杠,Amazon S3 首先会在存储桶中查找对象 photos。如果找不到photos 对象,则它会搜索索引文档photos/index.html。如果找到该文档,Amazon S3 将返回 302 Found 消息并指向 photos/ 键。对于对photos/ 的后续请求,Amazon S3 返回photos/index.html。"

按照他们文档的字母,尝试将您的 page.html 对象重命名为简单地称为 page(不带 .html 扩展名)。您必须为每个包含尾部斜杠的 URL 执行此操作,这很糟糕,但在亚马逊允许我们为此行为配置实际的重定向代码之前,我们一直坚持这样做。

【讨论】:

以上是关于当 url 没有斜杠时,AWS s3 强制 302 重定向 - 需要 301s的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 和 aws s3 在点击时强制下载图像

防止 AWS Amplify 添加斜杠和强制重定向

AFNetworking 2.0:NSURLSessionDownloadTask 在收到 302 到 AWS S3 时被取消

Chef 12 + AWS Opsworks + 从 s3 部署应用程序

从 heroku 访问 s3 内容时,AWS 访问密钥显示在浏览器 url 中

ASP.NET MVC + IIS7 + FireFox:URL 中的斜杠