Amazon S3对象redirect

是否有可能把redirect头在s3对象上? 像301redirect一样。

例如:

mybucket.amazon-aws.com/myobject --> example.com/test 

优选地,通过在对象上设置像这样的头部:

 HTTP/1.1 301 Moved Permanently Location: http://example.com/test Content-Type: text/html Content-Length: 0 

在上个月内,这个function刚添加完毕。

你可以在这里findAPI文档:

http://docs.amazonwebservices.com/AmazonS3/latest/dev/how-to-page-redirect.html

当你把你的对象,你需要设置对该对象的x-amz-website-redirect-location键到你想要使用的301redirect。

您也可以使用控制台。

在这里输入图像说明

如果为存储桶启用了网站托pipe,则可以添加301redirect。 根据它,redirect规则以XML格式在存储桶级别进行描述,并且可以通过AWS S3控制台(“静态网站托pipe”部分)在存储桶的属性中指定。 有关其语法的完整文档可以在这里find。

只要在一个地方pipe理所有的redirect,就可以使用这种方法。 例如,可以定义redirect规则

 <RoutingRule> <Condition> <KeyPrefixEquals>index.php</KeyPrefixEquals> </Condition> <Redirect> <ReplaceKeyWith>index.html</ReplaceKeyWith> </Redirect> </RoutingRule> <RoutingRule> <Condition> <KeyPrefixEquals>blog.php?id=21</KeyPrefixEquals> </Condition> <Redirect> <ReplaceKeyWith>mysql-utf-8-database-creation-snippet.html</ReplaceKeyWith> </Redirect> </RoutingRule> 

它看起来就像创build假对象并为它们指定x-amz-website-redirect-location元数据一样。 坏消息是一个存储桶中XML的数量不能超过50个。 是的,pipe理XML是不方便的。 但是对我来说,这种方式目前比较容易。 同样,因为在一个地方pipe理所有文件比较容易。

这个XML方法在你重新命名一个拥有大量页面的目录时是非常有用的。 在这种情况下,有必要为目录创build单个redirect规则,而不是为其中的每个页面单独规则。 例如

 <RoutingRule> <Condition> <KeyPrefixEquals>blog/</KeyPrefixEquals> </Condition> <Redirect> <ReplaceKeyPrefixWith>it-blog/</ReplaceKeyPrefixWith> </Redirect> </RoutingRule> 

根据这个规则example.com/blog/whatever会被redirect到example.com/it-blog/whatever

这种方法的另一个有用的function是它只replace前缀。 和目录一样,可以redirect页面,但保存查询参数。 如果这些查询参数有一些JS处理,这可能是合适的。 有了x-amz-website-redirect-location元数据,你可能会失去它们。

正如我所提到的,读取XML可能不方便。 为了解决这个问题,我在GWT中写了一个简单的在线工具 ,将纯文本与原来的和新的URL转换为XML格式。 它使用KeyPrefixEquals谓词并执行ReplaceKeyPrefixWithredirect。

最后,根据文档 ,如果网站托pipe被禁用,redirect支持不适用于这个桶。

最近添加的function: http : //aws.typepad.com/aws/2012/10/amazon-s3-support-for-website-redirects.html

编辑:请参阅上面的答案,因为此function现在在AWS中是原生的

不是真的没有。 没有一个内置的function,但是,你可以做的是创build你的对象,即使你不把它保存为HTML,你可以将它作为一个HTML文件应用。

例如:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="Refresh" content="0; URL=http://www.example.com/target/"> <title>Redirect</title> </head> <body> <a href="http://www.example.com/target/">http://www.example.com/target/</a> </body> </html> 

在这里看看这个页面:快速查看它的源代码。

view-source: http : //carltonbale.com.s3.amazonaws.com/distance_chart.png

你可以在这里看到一个解释:

第8点: http : //carltonbale.com/9-hidden-features-of-amazon-s3

htaccess 301到Amazon S3redirect转换


htaccess风格:

 Redirect 301 /old/old.html http://www.new.com/new/new.html 

转化为:

 <RoutingRule> <Condition> <KeyPrefixEquals>old/old.html</KeyPrefixEquals> </Condition> <Redirect> <HostName>www.new.com</HostName> <Protocol>http</Protocol> <HttpRedirectCode>301</HttpRedirectCode> <ReplaceKeyWith>new/new.html</ReplaceKeyWith> </Redirect> </RoutingRule> 

你可以写下如下的脚本:

 // ----------------- // Javascript // htaccess to amazon s3 redirect for static s3 websites. // (XML goes into S3 Bucket Properties Editor > [x] Enable website hosting > Edit Redirection Rules box.) // ----------------- var list = [ "Redirect 301 /old/old-1.html http://www.new.com/new/new-1.html", "Redirect 301 /old/old-2.html http://www.new.com/new/new-2.html", "Redirect 301 /old/old-3.html http://www.new.com/new/new-3.html" ]; var output = []; output.push('<?xml version="1.0"?>'); output.push('<RoutingRules>'); for(var i=0; i<list.length; i++){ var item = list[i].replace("Redirect 301 /", "").split(" "); var oldLoc = item[0]; var newLoc = item[1]; output.push(" <RoutingRule>"); output.push(" <Condition>"); output.push(" <KeyPrefixEquals>" + oldLoc + "/KeyPrefixEquals>"); output.push(" </Condition>"); output.push(" <Redirect>"); if(newLoc.substr(0, 1) == "/"){ output.push(" <ReplaceKeyWith>" + newLoc + "</ReplaceKeyWith>"); } else { var splitNewLoc = newLoc.replace("http://", "").split("/"); var host = splitNewLoc.shift(); var path = splitNewLoc.join("/"); output.push(" <HostName>" + host + "</HostName>"); output.push(" <Protocol>http</Protocol>"); output.push(" <HttpRedirectCode>301</HttpRedirectCode>"); if(path){ output.push(" <ReplaceKeyWith>" + path + "</ReplaceKeyWith>"); } } output.push(" </Redirect>"); output.push(" </RoutingRule>"); } output.push('</RoutingRules>'); print(output.join("\n")); 

警告:亚马逊限制redirect规则的数量为50。

AWSCLI可以让你轻松地做到这一点(有点)

  1. 确保水桶是100%公开的
  2. 确保存储区处于网站托pipe模式
  3. 只能使用完整urlhttps://<bucket_name>.s3-website-<region>.amazonaws.com
  4. 使用s3api调用来设置redirect

    aws s3api put-object –acl public-read –website-redirect-location“ http://other-location.com ”–bucket foo-bucket –key somewhere / blah

注意 :您不会将任何对象发布到S3,因为它只会提供301和redirectLocation标题。

用testing

curl -v 2 -L https://<bucket_name>.s3-website-<region>.amazonaws.com/somewhere/blah